深入解析Java虛擬機器
垃圾收集器手機演算法是記憶體回收的方法論,垃圾收集器是記憶體回收的具體實現。
並行:指多條垃圾收集執行緒並行工作,但此時使用者執行緒仍然處於等待狀態併發:值使用者執行緒與垃圾收集執行緒同時執行(但並不一定是並行的),使用者程式在繼續執行,而垃圾收集程式運行於另一個CPU上。
Serial收集器單執行緒收集器,也就是說是必須停止所有的工作執行緒,知道垃圾收集完畢。
對於單CPU來說更加高效。
所以適合運行於Client模式下的虛擬機器。
新生代採用複製演算法。老年代採用標記整理演算法。
ParNew收集器是Serial的多執行緒版本(看圖的話是在新生代多執行緒同時進行GC)。
是GC執行緒有多個,所有其他工作執行緒都停止。
多執行緒GC會有執行緒間互動這種上下文切換的效率損失。
新生代採用複製演算法。
老年代採用標記整理演算法。
Parallel Scavenge收集器多執行緒同時GC。
這款收集器的目的是更高的吞吐量。
是吞吐量優先收集器,高吞吐量會使得GC停頓時間變長。
但總體的使用者執行程式碼時間變多了。
吞吐量:執行使用者程式碼時間/(執行使用者程式碼時間+垃圾收集時間)該收集器既可以自動調節也可以通過手動配置來優化收集過程。
Serial Old收集器單執行緒收集器,標記整理演算法。
是Serial的老年代版本。
Parallel Old收集器是Parallel Scavenge收集器的老年代版本 標記整理演算法。
解決了只能和Serial Old收集器搭配的尷尬境地。
CMS收集器Concurrent Mark Sweep 收集器是以獲取最短回收停頓時間為目的的收集器。
B/S應用關注使用者的體驗,更短的響應時間。
CMS這點很適合。
從名字來看,併發標記清除。
是一款可以和使用者執行緒併發的收集器。
分為四個步驟:初始標記、併發標記、重新標記、併發清除。
其中初始標記和重新標記需要stop the world,也就是停止其他工作執行緒。
初始標記步驟標記所有GC Roots直接關聯到的物件,速度很快,併發標記階段就是進行GC Roots Tracing(追蹤)的過程。
重新標記是修正併發標記階段使用者執行緒繼續執行而發生的改變。
併發清除就不用說了。
整個過程最耗時的追蹤和清除實現了併發。而標記GC Roots和重新標記耗時很短。
缺點:
1、佔用使用者執行緒的CPU。影響使用者體驗。佔用執行緒數為(CPU數量+3)/4,CPU越多佔用的越少。
2、無法處理浮動垃圾,所以老年代要預留空間。可以上調老年代GC閾值來調優,但是太高會造成“Concurrent Mode Failure”失敗。造成啟用備用方案Serial Old來GC老年代,造成長時間停頓。反而降低效能
3、標記清除會造成老年代空間碎片太多,如果有大物件會引發Full GC。預設是每次Full GC都進行整理,可以設定次數來優化。(如果程式涉及大物件就多整理,如果不涉及就可以很少的整理)G1收集器特點:
1、併發與並行
2、分代收集 (所有收集器都是分代的)
3、空間整合
4、可預測的停頓Garbage First收集器是整堆收集器。雖然還保留新生代和老年代的概念,但是他們都是一部分Region的集合,而不再有物理隔離。
文章來自: