伊甸园区算法
在JVM的内存管理机制中,"伊甸园区"
是新生代的一部分,主要用于存放新创建的对象。当对象首次被创建时,通常会被放置在伊甸园区内。伊甸园区的垃圾回收主要遵循以下算法:
1. 前言:分代假设
大多数对象的生命周期很短。也就是说大部分新创建的对象很快就会成为垃圾,只有少数对象会存活较长时间。JVM基于这个假设将内存分为 年轻代
和 老年代
。年轻代又进一步细分为 伊甸园区
和 两个幸存者区(S0 和 S1)
2. 新生代垃圾回收(Minor GC)
- 对象分配:当对象被创建时,首先会被放入到伊甸园区。如果伊甸园区的空间不足,则会出发一次 Minor GC。
- 垃圾识别:在 Minor GC 过程中,垃圾回收器会识别哪些对象是活跃的(有引用指向),哪些对象已经死亡(没有引用指向)
- 复制存活对象:对于伊甸园区中的所有存活对象,垃圾回收器会将它们复制到其中一个幸存者区(通常是空的那个)。如果一个幸存者区已满,则另一个幸存者区会用于存储这些存活对象。
- 对象晋升:如果一个对象在幸存者区中经历了多次垃圾回收周期后依然存活(具体次数可以通过参数调整,默认为15次),那么这个对象会被移动到老年代。这是因为长期存活的对象更适合放在老年代中,以减少年轻代频繁的垃圾回收负担。
3. 示例流程
- 对象创建:新对象
A
被创建并放置在伊甸园区。 - 第一次 Minor GC:
- 垃圾回收器识别出对象
A
仍然存活。 - 对象
A
被复制到幸存者区S0
,年龄增加到1。 - 伊甸园区被清空。
- 垃圾回收器识别出对象
- 第二次 Minor GC:
- 垃圾回收器再次识别出对象
A
仍然存活。 - 对象
A
被从S0
复制到S1
,年龄增加到2。 S0
被清空。
- 垃圾回收器再次识别出对象
- 后续 Minor GC: 对象
A
继续在幸存者区之间复制,直到其年龄达到MaxTenuringThreshold
(例如15)。 当对象A
达到晋升阈值时,它被移动到老年代。
4. 参数配置
- -XX:NewRatio:设置年轻代与老年代的比例。例如,
-XX:NewRatio=3
表示老年代与年轻代的比例为3:1。 - -XX:SurvivorRatio:设置伊甸园区与幸存者区的比例。例如,
-XX:SurvivorRatio=8
表示伊甸园区与每个幸存者区的比例为8:1。 - -XX:MaxTenuringThreshold:设置对象晋升到老年代前在幸存者区的最大年龄。默认值为15。