安全點
可以中斷線程,進行GC的位置伤锚,一般是方法調用擅笔,循環(huán)處理,異常跳轉等應用程序長時間執(zhí)行的位置屯援。
需要線程去輪詢安全點信息猛们,發(fā)現(xiàn)線程執(zhí)行到該安全點,主動中斷線程
安全區(qū)域
對于無法響應安全點的線程狞洋,例如阻塞弯淘,睡眠線程,使用安全區(qū)域來解決徘铝,安全區(qū)域是指引用關系不會變化的耳胎,是安全點的擴展,線程進入安全區(qū)域會進行標記惕它,隨時可以進行GC
垃圾回收算法
一怕午、按系統(tǒng)線程分類
串行收集:實現(xiàn)容易,效率較高淹魄;無法使用多處理器的優(yōu)勢郁惜,所以此收集適合單處理器機器
并行收集:速度快,效率高甲锡;多線程處理垃圾回收工作兆蕉,但工作線程還是處在暫停階段
并發(fā)收集:不需要暫停工作線程;減少垃圾收集時的停頓時間缤沦;難度在于虎韵,增量的GC標記,如何準確標記
二缸废、按照回收策略分類
復制算法:需要兩倍內存空間包蓝;把內存空間劃為兩個相等的區(qū)域驶社,每次只使用其中一個區(qū)域。垃圾回收時测萎,遍歷當前使用區(qū)域亡电,把正在使用中的對象復制到另外一個區(qū)域中;算法每次只處理正在使用中的對象硅瞧,因此復制成本比較小份乒,同時復制過去以后還能進行相應的內存整理,不會出現(xiàn)“碎片”問題腕唧。
標記-清除算法:先標記或辖,再清除,會出現(xiàn)碎片問題四苇,但是空間利用率比 復制算法高
標記整理算法:標記孝凌,清除后,會讓所有存活對象都往左端空閑的空間進行移動月腋;不會出現(xiàn)碎片問題蟀架,空間利用率高,但是增加STW
垃圾回收器
一榆骚、年輕代
二片拍、老年代
三、CMS
過程:初始標記妓肢,并發(fā)標記捌省,重新標記,并發(fā)清除
因為清除是并發(fā)清除碉钠,所以CPU數(shù)量不高時纲缓,CMS對工作線程的影響很大,因為要分出線程資源給垃圾回收線程
無法處理浮動垃圾:在垃圾收集過程中喊废,工作線程還在不斷產生垃圾祝高,這部分只能留到下次GC,同時也因為會不斷生成垃圾污筷,所以Full GC不能等到老年代滿了再觸發(fā)工闺,默認閾值是68%
Full GC時會觸發(fā)碎片整理,這個步驟是無法并發(fā)的瓣蛀,通過jvm參數(shù) -XX:+UseCMSCompactAtFullCollection開關控制陆蟆,默認開啟
四、G1收集器
過程:初始標記惋增,并發(fā)標記叠殷,重新標記(STW),篩選回收(STW)
采用并發(fā)诈皿,標記整理算法溪猿,同時支持年輕代钩杰,老年代纫塌。
將java堆分成大小相等的獨立區(qū)域诊县,Region,邏輯上組成年輕代措左,老年代
整體上是標記整理算法依痊,但是微觀上(兩個Region之間)是復制算法,但最終都能避免碎片的產生
建立了可預測停頓模型怎披,指定在M毫秒的時間段內胸嘁,用在垃圾回收上的時間不超過N毫秒,所以不是掃描整個年輕代凉逛,老年代性宏,而是掃描部分具有高價值的Region,回收需要的時間及能回收到的空間大小状飞。
五毫胜、ZGC單代垃圾回收器
過程:初始標記,并發(fā)標記诬辈,重新標記酵使,并發(fā)轉移準備,初始轉移焙糟,并發(fā)轉移(即復制-回收)
設計目標:停頓時間不超過10ms口渔;停頓時間不會隨著堆的大小,或者活躍對象的大小而增加穿撮;支持8MB~4TB級別的堆(未來支持16TB)缺脉。
ZGC通過著色指針和讀屏障技術,解決了轉移過程中準確訪問對象的問題悦穿,實現(xiàn)了并發(fā)轉移
ZGC在低延遲(TP999 < 200ms)場景中收益較大攻礼;對吞吐量優(yōu)先的場景,ZGC可能并不適合咧党,究其原因有二:第一秘蛔,ZGC是單代垃圾回收器,而CMS是分代垃圾回收器傍衡。單代垃圾回收器每次處理的對象更多深员,更耗費CPU資源;第二蛙埂,ZGC使用讀屏障倦畅,讀屏障操作需耗費額外的計算資源