繁体   English   中英

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

[英]Does the garbage collector work on static variables or methods in java?

我正在创建一个示例演示程序,以使我理解如何使用垃圾收集器释放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
    }

}

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

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

如果希望将字段与实例相关联并进行清理,然后清理实例,则将其设置为实例字段,而不是静态字段。

除程序外,回答您的问题

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

  2. 静态变量属于Class实例,并且在加载后不会被垃圾回收 (对于大多数常规Classloader而言)

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

您应该了解System.gc(); 不调用垃圾收集器。 它只是礼貌地要求GC删除一些垃圾。 GC决定做什么,何时开始。 因此,不要指望在调用System.gc();时会立即见效System.gc(); ,将null分配给变量等。

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

我希望这种解释会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM