Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 此对象何时有资格进行垃圾收集?_Java_Garbage Collection - Fatal编程技术网

Java 此对象何时有资格进行垃圾收集?

Java 此对象何时有资格进行垃圾收集?,java,garbage-collection,Java,Garbage Collection,我有这段代码,我对对象o何时可以在Java中进行垃圾收集感到困惑 public class JustSo { public static void main(String[] args) { for(int i=0;i<4;i++) { Object o=new Object(); //o.doSomethi

我有这段代码,我对对象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");
        }
    }
公共类JustSo
{
公共静态void main(字符串[]args)
{

for(int i=0;i当对象超出范围时,因此在for循环的每次迭代之后。当对象不再可访问时,对象符合垃圾收集的条件,这种情况发生在两种情况下

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

后者是所讨论对象的情况,如果对象的引用在for循环之后超出范围,则在print语句之前。

当对象超出范围时,则在for循环的每次迭代之后。当对象不再可访问时,对象有资格进行垃圾收集,这种情况发生在2种情况下离子

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

后者是所讨论对象的情况,如果对象的引用在for循环之后超出范围,则在print语句之前。

当对象超出范围时,则在for循环的每次迭代之后。当对象不再可访问时,对象有资格进行垃圾收集,这种情况发生在2种情况下离子

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

后者是所讨论对象的情况,如果对象的引用在for循环之后超出范围,则在print语句之前。

当对象超出范围时,则在for循环的每次迭代之后。当对象不再可访问时,对象有资格进行垃圾收集,这种情况发生在2种情况下离子

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

后者是所讨论对象的情况,如果对象的引用在for循环之后超出范围,则在print语句之前。

每次循环,在发生
i++
时,对象将符合GC的条件。

每次循环,在
i++
hap>时pens时,对象将符合GC条件。

每次循环,在
i++
发生时,对象将符合GC条件。

每次循环,在
i++
发生时,对象将符合GC条件。

因为您没有将引用保存到某个外部sc中ope变量,并在每次迭代完成后创建新实例,其符合垃圾收集的条件

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

<>你可能会混淆作者的措辞。请考虑下面的代码

 for(int i=0;i<4;i++)
             {
                     Object o=new Object();
                     //o.doSomething();
             } -----> objects ready for GC here. 
             // some other code  
             // some other code
             System.out.println("DONE");
for(int i=0;i对象准备在此处进行GC。
//其他代码
//其他代码
系统输出打印项次(“完成”);

由于您没有将引用保存到某个外部范围变量中,并且每次迭代完成后都创建新实例,因此它符合垃圾收集的条件

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

<>你可能会混淆作者的措辞。请考虑下面的代码

 for(int i=0;i<4;i++)
             {
                     Object o=new Object();
                     //o.doSomething();
             } -----> objects ready for GC here. 
             // some other code  
             // some other code
             System.out.println("DONE");
for(int i=0;i对象准备在此处进行GC。
//其他代码
//其他代码
系统输出打印项次(“完成”);

由于您没有将引用保存到某个外部范围变量中,并且每次迭代完成后都创建新实例,因此它符合垃圾收集的条件

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

<>你可能会混淆作者的措辞。请考虑下面的代码

 for(int i=0;i<4;i++)
             {
                     Object o=new Object();
                     //o.doSomething();
             } -----> objects ready for GC here. 
             // some other code  
             // some other code
             System.out.println("DONE");
for(int i=0;i对象准备在此处进行GC。
//其他代码
//其他代码
系统输出打印项次(“完成”);

由于您没有将引用保存到某个外部范围变量中,并且每次迭代完成后都创建新实例,因此它符合垃圾收集的条件

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

<>你可能会混淆作者的措辞。请考虑下面的代码

 for(int i=0;i<4;i++)
             {
                     Object o=new Object();
                     //o.doSomething();
             } -----> objects ready for GC here. 
             // some other code  
             // some other code
             System.out.println("DONE");
for(int i=0;i对象准备在此处进行GC。
//其他代码
//其他代码
系统输出打印项次(“完成”);

正如oracle关于的文档所述:

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


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

正如oracle关于

自动垃圾收集是查看堆内存的过程,识别哪些对象正在使用,哪些没有使用,并删除未使用的对象。正在使用的对象或引用的对象意味着程序的某些部分仍保留指向堆内存的指针