7

我正在创建一个示例演示程序,让我了解如何使用垃圾收集器释放静态变量的引用、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
    }

}
4

4 回答 4

21

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

当持有类的 ClassLoader 被卸载时,静态字段被清理。在许多简单的程序中,这是永远不会的。

如果您希望将字段与实例关联并清理,则清理实例,使它们成为实例字段,而不是静态字段。

于 2012-10-29T17:50:05.410 回答
5

除了程序,回答你的问题

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

  2. 静态变量属于Class实例,一旦加载就不会被垃圾回收(对于大多数通用Classloader)

于 2012-10-29T17:49:48.380 回答
4

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

于 2012-10-29T17:42:37.017 回答
3

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

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

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

于 2012-10-29T17:44:13.413 回答