从这篇文章Strong references never be garbage collected开始,基于这种理解,我假设如果我们在内存中创建一个无限Strong Reference objects
,那么它必须抛出OutOfMemory
错误。
但是,当我在虚拟程序下运行时,它永远不会通过OutOfMemory
错误,尽管我在while循环中创建了无限对象。
public class Test2 {
public static void main(String[] args) {
while (true) {
Test2 obj = new Test2();
System.out.println(obj);
}
}
}
请帮助我理解强引用对象是否永远不会被垃圾回收,那么为什么没有OOM
错误。
答案 0 :(得分:1)
您不保持对该对象的强引用。每次进行循环时,都不再引用上次迭代中创建的对象,并且它有资格进行垃圾回收。
答案 1 :(得分:1)
如果通过强引用从GC-root-object可以访问对象,则不会对对象进行垃圾回收。在您的示例中,任何时候只能从您的线程访问一个Test2
- 对象。每次迭代都会更新强引用obj
,因此不再强烈引用先前的Test2
- 对象,并且可以进行垃圾回收。
如果要创建OOM,可以将新对象添加到List
并保留在那里。