jvm垃圾分代回收演算法

alexanderkenndy發表於2014-04-09
垃圾分代回收演算法(Generational Collecting)

基於對物件生命週期分析後得出的垃圾回收演算法。把物件分為年青代、年老代、 持久代,對不同生命週期的物件使用不同的演算法(上述方式中的一個)進行回收。 現在的垃圾回收器(從J2SE1.2 開始)都是使用此演算法的。

1. Young(年輕代)JVM specification 中的Heap 的一部份 年輕代分三個區。一個Eden 區,兩個Survivor 區。大部分物件在Eden 區中生 成。當Eden 區滿時,還存活的物件將被複制到Survivor 區(兩個中的一個), 當這個Survivor 區滿時,此區的存活物件將被複制到另外一個Survivor 區,當 這個Survivor 去也滿了的時候,從第一個Survivor 區複製過來的並且此時還存 活的物件,將被複制到年老區(Tenured)。需要注意,Survivor 的 兩個區是對稱的,沒先後關係,所以同一個區中可能同時存在從Eden 複製過來 物件,和從前一個Survivor 複製過來的物件,而複製到年老區的只有從第一個Survivor 去過來的物件。而且,Survivor 區總有一個是空的。

2. Tenured(年老代)JVM specification 中的Heap 的一部份 年老代存放從年輕代存活的物件。一般來說年老代存放的都是生命期較長的對
象。

3. Perm(持久代) JVM specification 中的Method area 用於存放靜態檔案,如今Java 類、方法等。持久代對垃圾回收沒有顯著影響, 但是有些應用可能動態生成或者呼叫一些class,例如Hibernate 等,在這種時 候需要設定一個比較大的持久代空間來存放這些執行過程中新增的類。持久代大 小通過-XX:MaxPermSize=進行設定。

相關文章