我正在创建一个示例演示程序,让我明白如何在使用垃圾收集器的java中释放静态变量,方法的引用?
我正在使用弱引用来防止垃圾收集器。
班级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;
}
}
班级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<Sample> wr = new WeakReference<Sample>(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
}
}
答案 0 :(得分:16)
静态字段与类关联,而不是单个实例。
在卸载类的ClassLoader时清除静态字段。在许多简单的程序中,这绝不是。
如果您希望将字段与实例关联并清理,则清除实例,将其设为实例字段,而不是静态字段。
答案 1 :(得分:5)
除了节目,回答你的问题
没有。 方法不是垃圾回收,因为它们首先不存在于堆中。
静态变量属于Class实例,加载后不会被垃圾回收(对于大多数常规类加载器)
答案 2 :(得分:4)
System.gc()不会强制垃圾收集器运行。这只是对JVM的一个建议,可能是运行垃圾收集器的好时机。请参阅此问题 - When does System.gc() do anything
答案 3 :(得分:3)
您应该明白System.gc();
不会调用垃圾收集器。它只是礼貌地要求GC删除一些垃圾。 GC决定做什么以及何时开始。因此,在调用System.gc();
,将null
分配给变量等时,不要指望您会立即看到效果。
GC会删除所有无法以任何方式访问的对象。因此,如果代码退出已定义变量的块,则可以删除该对象。 Assiging null将删除引用。弱引用不会阻止GC删除对象。
我希望这个解释有所帮助。