AFAIK,Java GC具有较小的GC(低成本)和较大的GC周期(较高的成本)。如果对象在本地范围内,则在次要GC中将其清除。如果对象的引用存储在代码中的其他位置,则在主GC中将其清除。因此,例如
void f() {
A a = new A();
a.doSomething();
}
根据我的描述(如果确实如此),对象a将在次要GC中清除。怎么样
void f() {
A a = new A();
B b = new B();
b.doSomething(a);
}
这里对象a作为参数传递给B的doSomething方法,也许B将引用存储在B本身中,但是我们不知道。在这种情况下,对象a将在次要GC或主要GC中清除吗?
您不能只看代码就知道。GC将根据需求运行,并且GC的频率将随程序和环境的每次运行而变化。然后,GC循环的频率(以及JVM实现)将确定在仍处于[[Young]]生成时将要收集对象还是将其升级为Old gen。在Old gen中时,仍可以在“并发”阶段(取决于收集器)收集对象,而不必在完全停止世界GC期间收集。这可以为您提供整个过程的良好概览:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
此外,这是一篇很好的文章,旨在了解次要,主要和完全GC之间的区别:https://plumbr.io/blog/garbage-collection/minor-gc-vs-major-gc-vs-full-gc