JVM垃圾回收算法

找到垃圾的方法

一、引用計數:沒法解決循環引用的問題算法

二、根可達性算法:CG root 包括 線程棧變量、靜態變量、常量池、JNI指針(調用C或C++用到的本地方法對象)多線程

清除算法

一、標記-清除  Mark - sweep   適合存活對象較多的。容易產生碎片,掃描兩遍併發

二、拷貝 copy    適合存活對象較少的。浪費內存,移動複製對象,須要調整引用,掃描一遍ide

三、標記-壓縮    Mark - compact         不容易產生碎片、不浪費內存,但 掃描兩遍,移動對象線程

分代模型

除Epsilon ZGC Shenandoah以外的GC都是使用邏輯分代模型指針

G1是邏輯分代,物理不分代對象

除此以外不只邏輯分代,並且物理分代內存

棧上分配

線程私有小對象it

無逃逸class

線程本地分配(TLAB)

本地線程大小佔用Eden的1%

小對象

多線程的時候不用競爭Eden就能夠申請空間

常見的垃圾回收器

一、serial 和 serial old

二、parallel  和 parallel old

三、parNew 和 CMS

四、G1

五、ZGC 和 Shenandoah

CMS (併發)

初始標記(只標根節點) -> 併發標記 ->從新標記(標記併發標記產生的新對象)-> 併發清理

CMS的問題

一、內存碎片,碎片太多,會用Serial Old 去清理老年代碎片

二、浮動垃圾(第二次回收)

併發標記算法:三色標記

垃圾收集器跟內存大小的關係

  1. Serial 幾十兆
  2. PS 上百兆 - 幾個G
  3. CMS - 20G
  4. G1 - 上百G
  5. ZGC - 4T - 16T(JDK13)
相關文章
相關標籤/搜索