【问题标题】:When is a reference ready for garbage collection? [duplicate]参考何时准备好进行垃圾回收? [复制]
【发布时间】:2015-12-31 03:19:18
【问题描述】:
class MyObj {
    public void print() {
        System.out.println("Hello!");
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("MyObj Destroyed");
        super.finalize();
    }

    public static void main(String... args) {
        MyObj obj = new MyObj();
        obj.print();
        for (int i = 0; i < 10000000; i++) {
            byte[] b = new byte[100];
        }
        System.out.println("done");
    }
}

你好!
MyObj 已销毁
完成了

但是当我把main方法改成这个

public static void main(String... args) {
    MyObj obj = new MyObj();
    obj.print();
    for (int i = 0; i < 10000000; i++) { 
        byte[] b = new byte[100]; //just create objects to force garbage collector to run
    }
    obj.print(); //call print here
    System.out.println("done");
}

你好!
你好!
完成了

Java 是否会在上次使用时自动将强引用设置为 null?

【问题讨论】:

  • 当它不再可达时,当您将调用复制到 for 循环之后;在for 循环之后可以访问它(因此不符合gc 的条件)。
  • 一个 referencenever 准备好进行垃圾回收,但一个 object 是,当它没有实时引用时。 Java 不会在初始化后自动将任何内容设置为 null。

标签: java garbage-collection


【解决方案1】:

当一个对象不再可访问时,它就有资格进行垃圾回收。
仅仅因为一个对象有资格进行垃圾回收并不意味着它会被回收。

【讨论】:

  • 调用System.gc() 不会做任何事情,因为分配的内存不多。我已经试过了。如果您调用它,则由垃圾收集器来运行。
  • 调用 System.gc() 只是对垃圾收集器进行循环的建议。根本没有办法以任何方式强制或触发垃圾收集。如果一个程序非常小,那么无论你调用多少次,它都很有可能永远不会运行。
  • 我已经删除了关于 System.gc() 的部分
猜你喜欢
  • 2015-11-05
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2014-04-21
  • 1970-01-01
  • 2015-03-30
  • 2010-11-09
相关资源
最近更新 更多