这个对象什么时候有资格进行垃圾回收?
When does this object become eligible for 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.doSomething();
}
System.out.println("DONE");
}
}
因为它在一个循环(或与此相关的任何块)内,所以它会在循环结束时变得合格,对吗?
但我在一个可靠的开发者网站上找到了一个答案(不想透露在哪里)说对象最早符合条件是在打印声明中。
请说明。
当它超出范围时,因此在 for 循环的每次迭代之后。当一个对象不再可访问时,它符合垃圾回收的条件,这发生在两种情况下。
- 该对象不再有任何指向它的引用。
- 对该对象的所有引用都超出了范围。
后者是所讨论对象的情况,对象的引用在 for 循环之后超出范围。在打印语句之前。
每次循环,大约在 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");
正如有关 garbagecollector 的 oracle 文档所说:
Automatic garbage collection is the process of looking at heap memory, identifying which objects are in use and which are not, and deleting the unused objects. An in use object, or a referenced object, means that some part of your program still maintains a pointer to that object. An unused object, or unreferenced object, is no longer referenced by any part of your program. So the memory used by an unreferenced object can be reclaimed.
这意味着一旦 Object
未被任何其他 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");
}
}
因为它在一个循环(或与此相关的任何块)内,所以它会在循环结束时变得合格,对吗?
但我在一个可靠的开发者网站上找到了一个答案(不想透露在哪里)说对象最早符合条件是在打印声明中。
请说明。
当它超出范围时,因此在 for 循环的每次迭代之后。当一个对象不再可访问时,它符合垃圾回收的条件,这发生在两种情况下。
- 该对象不再有任何指向它的引用。
- 对该对象的所有引用都超出了范围。
后者是所讨论对象的情况,对象的引用在 for 循环之后超出范围。在打印语句之前。
每次循环,大约在 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");
正如有关 garbagecollector 的 oracle 文档所说:
Automatic garbage collection is the process of looking at heap memory, identifying which objects are in use and which are not, and deleting the unused objects. An in use object, or a referenced object, means that some part of your program still maintains a pointer to that object. An unused object, or unreferenced object, is no longer referenced by any part of your program. So the memory used by an unreferenced object can be reclaimed.
这意味着一旦 Object
未被任何其他 Object
引用或超出范围,它将被标记为删除。在这种情况下,引用超出范围,每次循环再次开始(就在每次增量之前)。因此,每个对象都将在循环结束时(在下一次循环重复之前)被标记为删除。