看完《深刻理解JVM》,結合網上資料後根據跟人理解整理出的簡潔版,主要關注是什麼, 怎麼作到的,特色等,沒有進入深刻剖析,旨在快速瞭解,具體應用時我的再根據具體點去進行深刻。歡迎留言討論!html
是什麼?算法
垃圾回收器是垃圾回收算法的包裝,能夠在JVM中設置須要使用的垃圾回收器;多線程
怎麼作?併發
Serial收集器:spa
單線程進行垃圾回收, 執行回收過程當中,程序會暫停。.net
特色:簡單高效,適用於單個CPU場景。經常使用於新生代回收;線程
SerialOld: Serial的老年代版本;用於老年代回收;htm
parnew收集器:blog
Serial 的多線程版本,回收過程當中,程序也會暫停;內存
特色:適合多核場景,用於新生代回收,能夠與CMS配合;
Parallel收集器:
並行回收,程序會暫停,可控制吞吐量;
特色:吞吐量優先,更關注可控制的吞吐量,用於新生代回收;
ParallelOld收集器:paraller老年代版本;
parallel+parallelOld 爲吞吐量優先組合,當應用程序運行在具備多個CPU上,對暫停時間沒有特別高的要求時,即程序主要在後臺進行計算,而不須要與用戶進行太多交互;
例如,那些執行批量處理、訂單處理、工資支付、科學計算的應用程序;
cms收集器:
採用標記清除算法,多線程回收,僅用於老年代;
運做流程:初始標記、併發標記、從新標記、併發清除
在併發標記、併發清除階段能夠多線程並行進行;
特色:併發收集,低停頓,以回收最短停頓時間爲目標,適用於常見B/S場景;
缺點:
須要內存大,影響吞吐;
沒法及時清理浮動垃圾;
產生大量內存碎片;
解決辦法:
經過 -XX:CMSInitiatingOccupancyFraction設置預留空間,以減小由於浮動垃圾,致使內存空間沒法知足致使的fullgc;
經過 -XX:+UseCMSCompactAtFullCollection開啓碎片合併整理;
配合-XX:+CMSFullGCsBeforeCompaction設置執行多少次不壓縮的fullgc後進行一次整理壓縮;
G1收集器:
1.7版本推出,多線程處理,可管理整個堆內存的垃圾回收:
運做流程:初始標記、併發標記、最終標記、篩選回收
特色:
結合多種垃圾算法,空間整合,不產生碎片
低停頓的同時實現高吞吐量
場景:面向服務端應用,針對具備大內存、多處理器的機器;
最主要的應用是爲須要低GC延遲,並具備大堆的應用程序提供解決方案;
如:在堆大小約6GB或更大時,可預測的暫停時間能夠低於0.5秒;
經常使用參數:
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:+UseParNewGC:在新生代使用並行收集器
-XX:+UseParallelGC :新生代使用並行回收收集器,更加關注吞吐量
-XX:+UseParallelOldGC:老年代使用並行回收收集器
-XX:ParallelGCThreads:設置用於垃圾回收的線程數
-XX:+UseConcMarkSweepGC:新生代使用並行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:設定CMS的線程數量
-XX:+UseG1GC:啓用G1垃圾回收器
-XX:InitiatingHeapOccupancyPercent:當整個Java堆的佔用率達到參數值時,開始併發標記階段;默認爲45;
-XX:MaxGCPauseMillis:爲G1設置暫停時間目標,默認值爲200毫秒;
-XX:G1HeapRegionSize:設置每一個Region大小,範圍1MB到32MB;目標是在最小Java堆時能夠擁有約2048個Region;
參考地址: