我试图了解Java GC的工作方式。假设由于分配请求,Eden空间已满。发生次要GC,将所有Eden和Survival1对象收集到Survival2中。但是Survival2中的物体比空间更多。据我所知,发生这种情况时,溢出会移到“使用权”空间(过早?在预定数量的GC迭代之前,对象应该留在“年轻”空间中)。如果托管空间有足够的空间用于溢出,这样的事件还会触发托管空间的GC吗?
我不在这里考虑G1垃圾回收。
答案 0 :(得分:1)
您关于幸存者空间如何工作的假设是正确的。如果“到”幸存者空间没有足够的空间来存储从“从”空间复制的对象以及从伊甸园收集的对象,则对象(在达到使用期限阈值之前)会过早地升级到老一代。
老一代。是分开的,因此仅当从Young gen升级对象时才会触发GC。造成它。通过CMS和G1之类的算法,它们使用占用率之类的值来决定何时启动GC。老一代的GC。如果仍有足够的促销空间,则可能会触发该触发事件,但不确定。