垃圾收集器是否可以处理java中的静态变量或方法?

我正在创建一个示例演示程序,让我明白如何使用垃圾收集器释放静态变量的引用,java中的方法?

我正在使用Weak Reference来防止垃圾收集器。

class级Sample

 public class Sample { private static String userName; private static String password; static { userName = "GAURAV"; password = "password"; } public static String getUserName(){ return userName; } public static String getPassword(){ return password; } } 

class级User

 import java.lang.ref.WeakReference; public class User { public static void main(String[] args) { /** * Created one object of Sample class */ Sample obj1 = new Sample(); /** * I can also access the value of userName through it's class name */ System.out.println(obj1.getUserName()); //GAURAV WeakReference wr = new WeakReference(obj1); System.out.println(wr.get()); //com.test.ws.Sample@f62373 obj1 = null; System.gc(); System.out.println(wr.get()); // null /** * I have deallocate the Sample object . No more object referencing the Sample oblect class but I am getting the value of static variable. */ System.out.println(Sample.getUserName()); // GAURAV } } 

静态字段与类关联,而不是单个实例。

保持类卸载的ClassLoader时,将清除静态字段。 在许多简单的程序中,这绝不是。

如果您希望将字段与实例关联并清理,则清除实例,将其设为实例字段,而不是静态字段。

System.gc()不强制垃圾收集器运行。 这只是对JVM的一个建议,可能是运行垃圾收集器的好时机。 看到这个问题 – System.gc()什么时候做

除了程序,回答你的问题

  1. 不会方法不是垃圾收集的,因为它们首先不存在于堆中。

  2. 静态变量属于Class实例,加载后不会被垃圾收集 (对于大多数通用类加载器)

你应该明白System.gc(); 不叫垃圾收集器。 它只是礼貌地要求GC删除一些垃圾。 GC决定做什么以及何时开始。 因此,不要指望在调用System.gc();时会立即看到效果System.gc(); ,将null赋给变量等。

GC将删除无法以任何方式访问的所有对象。 因此,如果代码退出已定义变量的块,则可以删除该对象。 Assiging null将删除引用。 弱引用不会阻止GC删除对象。

我希望这个解释有所帮助。