从这篇文章中,强烈的参考永远不会收集垃圾,如果我们在内存中创建一个无限的 Strong Reference objects
,则假设我假设它必须丢弃 OutOfMemory
error。
但是,当我在虚拟程序下运行时,它永远不会通过OutOfMemory
错误,尽管我在循环时创建了无限的对象。
public class Test2 {
public static void main(String[] args) {
while (true) {
Test2 obj = new Test2();
System.out.println(obj);
}
}
}
请帮助我了解是否从未收集过强引用的对象,那么如何出现OOM
错误。
您不保留对对象的强烈引用。每次您遍历循环时,都不再对上次迭代中创建的对象进行任何参考,并且有资格获得垃圾收集。
如果可以通过强引用从GC-ROOT-OBROTS到达,则不会收集垃圾。在您的示例中,随时只能从线程达到一个Test2
-Object。强参考obj
已更新每次迭代,因此以前的Test2
-Object不再从任何地方强烈引用,并且可以收集垃圾。
如果要创建一个OOM,则可以将新对象添加到List
并将其保存在那里。