2020牛客暑期多校訓練營(第二場) Boundary
阿新 • • 發佈:2020-07-15
一、如何判定垃圾?
1.1.Reference Count引用計數法:引用計數count=0的物件
1.2.Root Seaching根可達法:從root開始不可達的物件
常見的可做GC roots的例項有:(只要從某個地方出發能發現存活物件,它們就是GC Root)。原始碼中列舉一共有10種。
- JVM Stack: 虛擬機器器棧(棧楨中的本地變量表)中引用的變數
- static references in method area :方法區中的類靜態屬性引用的物件
- run-time constant pool: 執行時常量池(方法區中常量引用的物件)
- 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 來設定 )