一、引用計數:沒法解決循環引用的問題算法
二、根可達性算法: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 去清理老年代碎片
二、浮動垃圾(第二次回收)
併發標記算法:三色標記
垃圾收集器跟內存大小的關係