本系列是用來記錄《深刻理解Java虛擬機》這本書的讀書筆記。方便本身查看,也方便你們查閱。java
欲速則不達,欲達則欲速!服務器
1、collector種類多線程
GC在 HotSpot VM 5.0裏有四種:併發
incremental (sometimes called train) low pause collector已被廢棄,不在介紹app
類別 | serial collector | parallel collector ( throughput collector ) |
concurrent collector (concurrent low pause collector) |
介紹 | 單線程收集器性能 使用單線程去完成全部的GC工做,沒有線程間的通訊,這種方式會相對高效spa |
並行收集器線程 使用多線程的方式,利用CUP來提升GC的效率,主要以到達必定的吞吐量爲目標code |
併發收集器orm 使用多線程的方式,利用多CPU來提升GC的效率,併發完成大部分工做,使得GC pause短 |
試用場景 | 單處理器機器且沒有pause time的要求 | 適用於科學技術和後臺處理有中大規模數據集的應用 且運行在多處理器上,關注吞吐量(throughput) |
適合中規模/大規模數據集大小的應用,應用服務器,電信領域。關注response time,而不是throughput |
使用 | Client模式下默認 可以使用 可用-XX:+UseSerialGC強制使用 優勢:對server應用沒什麼優勢 缺點:慢,不能充分發揮硬件資源 |
Server模式下默認 --YGC:PS FGC:Parallel MSC 可用-XX:+UseParallelGC 或-XX:+UseParallelOldGC強制指定 --ParallelGC表明FGC爲Parallel MSC --ParallelOldGC表明FGC爲Parallel Compacting 優勢:高效 缺點:當heap變大後,形成的暫停時間會變得比較長 |
可用-XX:+
|
內存回收觸發 | YGC 包括RMI等的定時觸發 |
YGC eden空間不足 FGC old空間不足 perm空間不足 顯示調用System.gc() ,包括RMI等的定時觸發 |
YGC 調用了System.gc. |
內存回收觸發 時發生了什麼 |
YGC 中加載的class的信息 |
YGC class信息,並進行壓縮 class信息,並進行部分壓縮 |
YGC 加載的class信息 |
細節參數 | 可用-XX:+UseSerialGC強制使用 -XX:SurvivorRatio=x,控制eden/s0/s1的大小 -XX:MaxTenuringThreshold,用於控制對象在新生代存活的最大次數 -XX:PretenureSizeThreshold=x,控制超過多大的字節的對象就在old分配. |
-XX:SurvivorRatio=x,控制eden/s0/s1的大小 -XX:MaxTenuringThreshold,用於控制對象在新生代存活的最大次數 -XX:UseAdaptiveSizePolicy 去掉YGC後動態調整eden from已經tenuringthreshold的動做 -XX:ParallelGCThreads 設置並行的線程數 |
XX:CMSInitiatingOccupancyFraction 設置old gen使用到達多少比率時觸發 -XX:CMSInitiatingPermOccupancyFraction,設置Perm Gen使用到達多少比率時觸發 -XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行觸發CMS GC |
注:
2、CMS GC Incremental mode
當要使用 concurrent low pause collector時,在java的opt里加上 -XX:+UseConcMarkSweepGC。concurrent low pause collector還有一種爲CPU少的機器準備的模式,叫Incremental mode。這種模式使用一個CPU來在程序運行的過程當中GC,只用不多的時間暫停程序,檢查對象存活。
在Incremental mode裏,每一個收集過程當中,會暫停兩次,第二次略長。第一次用來,簡單從root查詢存活對象。第二次用來,詳細檢查存活對象。整個過程以下:
* stop all application threads; do the initial mark; resume all application threads(第一次暫停,初始話標記) * do the concurrent mark (uses one procesor for the concurrent work)(運行是標記) * do the concurrent pre-clean (uses one processor for the concurrent work)(準備清理) * stop all application threads; do the remark; resume all application threads(第二次暫停,標記,檢查) * do the concurrent sweep (uses one processor for the concurrent work)(運行過程當中清理) * do the concurrent reset (uses one processor for the concurrent work)(復原)
當要使用Incremental mode時,須要使用如下幾個變量:
-XX:+CMSIncrementalMode default: disabled 啓動i-CMS模式(must with -XX:+UseConcMarkSweepGC) -XX:+CMSIncrementalPacing default: disabled 提供自動校訂功能 -XX:CMSIncrementalDutyCycle=<N> default: 50 啓動CMS的上線 -XX:CMSIncrementalDutyCycleMin=<N> default: 10 啓動CMS的下線 -XX:CMSIncrementalSafetyFactor=<N> default: 10 用來計算循環次數 -XX:CMSIncrementalOffset=<N> default: 0 最小循環次數(This is the percentage (0-100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections.) -XX:CMSExpAvgFactor=<N> default: 25 提供一個指導收集數
SUN推薦的使用參數是:
-XX:+UseConcMarkSweepGC \ -XX:+CMSIncrementalMode \ -XX:+CMSIncrementalPacing \ -XX:CMSIncrementalDutyCycleMin=0 \ -XX:CMSIncrementalDutyCycle=10 \ -XX:+PrintGC Details \ -XX:+PrintGCTimeStamps \ -XX:-TraceClassUnloading 注:若是使用throughput collector和concurrent low pause collector,這兩種垃圾收集器,須要適當的挺高內存大小,覺得多線程作準備。
3、如何選擇collector
app運行在單處理器機器上且沒有pause time的要求,讓vm選擇單線程收集器serial collector。
重點考慮peak application performance(高性能),沒有pause time太嚴格要求,選擇並行收集器parallel collector。
重點考慮response time,pause time要小,選擇併發收集器concurrent collector。
鳴謝:特別感謝做者周志明提供的技術支持!