垃圾收集器 手機演算法是記憶體回收的方法論,垃圾收集器是記憶體回收的具體實現。 並行:指多條垃圾收集線程並行工作,但此時用戶線程仍然處於等待狀態 併發:值用戶線程與垃圾收集線程同時執行(但並不一定是並行的),用戶程式在繼續運行,而垃圾收集程式運行於另一個CPU上。 Serial收集器 單線程收集器,也就是 ...
垃圾收集器
手機演算法是記憶體回收的方法論,垃圾收集器是記憶體回收的具體實現。
並行:指多條垃圾收集線程並行工作,但此時用戶線程仍然處於等待狀態
併發:值用戶線程與垃圾收集線程同時執行(但並不一定是並行的),用戶程式在繼續運行,而垃圾收集程式運行於另一個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的集合,而不再有物理隔離。