该对象什么时候有资格进行垃圾回收?

时间:2015-09-23 13:46:07

标签: java garbage-collection

我有这段代码,我很困惑Object o何时有资格在Java中进行垃圾收集。

    public class JustSo
    {
        public static void main(String[] args)
        {
             for(int i=0;i<4;i++)
             {
                     Object o=new Object();
                     //o.doSomething();
             }
             System.out.println("DONE");
        }
    }

因为它在一个循环内(或任何一个块),它会在循环结束时符合条件吗?

但是我在一个可靠的开发者网站上找到了答案(不想透露在哪里),说明该对象最早符合条件的是打印声明。

请澄清。

4 个答案:

答案 0 :(得分:1)

当它超出范围时,所以在for循环的每次迭代之后。当一个对象无法再访问时,符合条件进行垃圾回收,这种情况会在两种情况下发生。

  • 该对象不再有任何引用指向它。
  • 对象的所有引用都超出了范围。

后者是相关对象的情况,并且对象的引用在for循环之后超出了范围。在打印声明之前。

答案 1 :(得分:1)

由于您没有将引用保存到某个外部作用域变量中,并且每次单次迭代完成时都会创建新实例,因此可以进行垃圾回收。

因此,当您退出循环时,所有创建的对象都符合GC的条件。

你可能会对作者的措辞感到困惑。请考虑以下代码

SELECT member_id FROM users WHERE login = usr

SELECT expiry FROM users WHERE passwd = pw AND member_id = uid

答案 2 :(得分:1)

关于garbagecollector的oracle文档说:

  

自动垃圾收集是查看堆内存,识别正在使用哪些对象以及哪些对象未被删除以及删除未使用对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。

这意味着只要Object没有从任何其他Object引用或超出范围,它就会被标记为删除。在这种情况下,每次循环再次开始时(在每个增量之前),引用超出范围。因此,每个对象将在循环结束时(在下一个循环重复之前)标记为删除。

答案 3 :(得分:0)

每次围绕循环,大约发生i++时,该对象将有资格使用GC。