Java堆中的每个对象都有一个标头,垃圾收集(GC)算法使用该标头。年轻的空间收集器(负责对象提升)使用此标头中的几位来跟踪幸存的收集对象的数量(32位JVM为此使用4位,而64位可能更多)
。
在收集年轻空间期间,将复制每个对象。可以将对象复制到一个生存空间(一个在年轻GC之前为空的生存空间)或一个旧空间。对于每个要复制的对象,GC算法都会增加其使用
期限 (幸存的收藏数量),如果该使用 期限 超过当前使用 期限阈值
,则会将其复制(升级)到旧空间。如果生存空间已满(溢出),也可以将对象直接复制到旧空间。
对象的旅程具有以下模式:
- 在伊甸园分配
- 由于年轻的GC而从伊甸园复制到生存空间
- 由于年轻的GC而从生存空间复制到(其他)生存空间(这可能会发生几次)
- 由于年轻的GC(或完整的GC)而从生存(或可能的伊甸园)提升到旧空间
实际的使用 期限阈值 是由JVM动态调整的,但是MaxTenuringThreshold对此设置了上限。
如果设置MaxTenuringThreshold = 0,则所有对象将立即升级。
我有几篇有关Java垃圾回收的文章,您可以在其中找到更多详细信息。



