Skip to content

伊甸园区算法

在JVM的内存管理机制中,"伊甸园区" 是新生代的一部分,主要用于存放新创建的对象。当对象首次被创建时,通常会被放置在伊甸园区内。伊甸园区的垃圾回收主要遵循以下算法:

1. 前言:分代假设

大多数对象的生命周期很短。也就是说大部分新创建的对象很快就会成为垃圾,只有少数对象会存活较长时间。JVM基于这个假设将内存分为 年轻代老年代。年轻代又进一步细分为 伊甸园区两个幸存者区(S0 和 S1)

2. 新生代垃圾回收(Minor GC)

  1. 对象分配:当对象被创建时,首先会被放入到伊甸园区。如果伊甸园区的空间不足,则会出发一次 Minor GC。
  2. 垃圾识别:在 Minor GC 过程中,垃圾回收器会识别哪些对象是活跃的(有引用指向),哪些对象已经死亡(没有引用指向)
  3. 复制存活对象:对于伊甸园区中的所有存活对象,垃圾回收器会将它们复制到其中一个幸存者区(通常是空的那个)。如果一个幸存者区已满,则另一个幸存者区会用于存储这些存活对象。
  4. 对象晋升:如果一个对象在幸存者区中经历了多次垃圾回收周期后依然存活(具体次数可以通过参数调整,默认为15次),那么这个对象会被移动到老年代。这是因为长期存活的对象更适合放在老年代中,以减少年轻代频繁的垃圾回收负担。

3. 示例流程

  1. 对象创建:新对象 A 被创建并放置在伊甸园区。
  2. 第一次 Minor GC:
    • 垃圾回收器识别出对象 A 仍然存活。
    • 对象 A 被复制到幸存者区 S0,年龄增加到1。
    • 伊甸园区被清空。
  3. 第二次 Minor GC:
    • 垃圾回收器再次识别出对象 A 仍然存活。
    • 对象 A 被从 S0 复制到 S1,年龄增加到2。
    • S0 被清空。
  4. 后续 Minor GC: 对象 A 继续在幸存者区之间复制,直到其年龄达到 MaxTenuringThreshold(例如15)。 当对象 A 达到晋升阈值时,它被移动到老年代。

4. 参数配置

  • -XX:NewRatio:设置年轻代与老年代的比例。例如,-XX:NewRatio=3 表示老年代与年轻代的比例为3:1。
  • -XX:SurvivorRatio:设置伊甸园区与幸存者区的比例。例如,-XX:SurvivorRatio=8 表示伊甸园区与每个幸存者区的比例为8:1。
  • -XX:MaxTenuringThreshold:设置对象晋升到老年代前在幸存者区的最大年龄。默认值为15。

Released under the MIT License.