xinzhuxiansheng / blog-notes

blog-notes
22 stars 2 forks source link

JVM堆(Heap)为什么会有两块幸存者区S0和S1? #41

Closed xinzhuxiansheng closed 1 year ago

xinzhuxiansheng commented 1 year ago

在JVM的堆内存中,新生代(Young Generation)被划分为三个部分:Eden区、Survivor 0区(S0)和Survivor 1区(S1)。S0和S1通常被称为幸存者区(Survivor Spaces)。幸存者区的存在主要是为了解决对象在经历一次或多次Minor GC后仍然存活的问题。

当Minor GC发生时,JVM首先回收Eden区中的短暂对象。在这个过程中,仍然存活的对象会被移动到一个幸存者区(例如S0),此时S0称为"to-space",而另一个空的幸存者区(S1)称为"from-space"。在下一次Minor GC时,JVM将会回收Eden区以及上一轮GC后变为"from-space"的幸存者区(这里是S0)。在这次GC过程中仍然存活的对象将被移动到另一个幸存者区(这里是S1),此时S1变为"to-space",而S0变为"from-space"。

幸存者区的设计有以下优点:

  1. 减少内存碎片:在对象移动过程中,JVM会对存活对象进行整理,避免内存碎片的产生。

  2. 年龄阈值:JVM可以跟踪对象在幸存者区的生命周期。当一个对象在幸存者区中多次GC后仍然存活,JVM会认为这个对象可能是长期存活的,并将其提升到老年代(Old Generation)以减少新生代中的Minor GC操作。

  3. 动态调整:使用两个幸存者区可以在每次GC时动态调整存活对象的分配,提高内存利用率。

总之,两个幸存者区S0和S1的设计,有助于提高内存利用率、减少内存碎片和有效地管理短暂存活和长期存活的对象。