JVM系列6-GC算法

 

正文

一、如何判定垃圾?

1.1.Reference Count引用計數法:引用計數count=0的對象

1.2.Root Seaching根可達法:從root開始不可達的對象

  常見的可做GC roots的實例有:(只要從某個地方出發能發現存活對象,它們就是GC Root)。源碼中枚舉一共有10種。

  1. JVM Stack: 虛擬機棧(棧楨中的本地變量表)中引用的變量
  2. static references in method area :方法區中的類靜態屬性引用的對象
  3. run-time constant pool: 運行時常量池(方法區中常量引用的對象)
  4. native method stack:  本地方法棧中JNI引用對象

二、常用GC算法

2.1 3種GC算法

序號 名稱 實現 優點 缺點
1 Mark-Swap標記清除 2遍掃描:1.標記可回收,2.清除。 算法簡單,存活對象多時效率高。 效率低,容易產生碎片。
2 Copying 複製算法 內存對半分,只掃描一次:把有引用的對象複製到一半,另一半清空

只掃描一次,效率高;

存活對象少時效率高

無碎片

空間浪費

移動複製對象,需要調整對象引用;

3 Mark-Compact標記整理(壓縮) 2遍掃描:1.找到不可回收,2.挪到一邊去 無碎片

掃描2次,效率低,

需要移動對象

2.2 分代模型

新生代(eden+S0+S1):大量死去,少量存活,使用Copying。

老年代(old):存活率高,回收較少,使用MS、MC。

注:

  • 1.JVM使用哪種GC算法,得看GC使用哪種垃圾回收器。
  • 2.除ZGC SD不分代, G1是邏輯分代,物理不分,其他是邏輯+物理都分代。

三、GC概念

 如上圖,默認:

1.新生代 ( Young ) 與老年代 ( Old ) 的比例的值爲 1:2 ( 該值可以通過參數 –XX:NewRatio 來指定 )

2.Edem : s0(from) : s1(to) = 8 : 1 : 1 ( 可以通過參數 –XX:SurvivorRatio 來設定 )

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章