1.gc參數配置:併發
-XX:+UseG1GCjvm |
使用 G1 垃圾收集器spa |
-XX:MaxGCPauseMillis=200線程 |
設置指望達到的最大GC停頓時間指標(JVM會盡力實現,但不保證達到)日誌 |
-XX:InitiatingHeapOccupancyPercent=45對象 |
啓動併發GC週期時的堆內存佔用百分比. G1之類的垃圾收集器用它來觸發併發GC週期,基於整個堆的使用率,而不僅是某一代內存的使用比. 值爲 0 則表示」一直執行GC循環」. 默認值爲 45.排序 |
-XX:NewRatio=n內存 |
新生代與老生代(new/old generation)的大小比例(Ratio). 默認值爲 2.it |
-XX:SurvivorRatio=nio |
eden/survivor 空間大小的比例(Ratio). 默認值爲 8. |
-XX:MaxTenuringThreshold=n |
提高年老代的最大臨界值(tenuring threshold). 默認值爲 15. |
-XX:ParallelGCThreads=n |
設置垃圾收集器在並行階段使用的線程數,默認值隨JVM運行的平臺不一樣而不一樣. |
-XX:ConcGCThreads=n |
併發垃圾收集器使用的線程數量. 默認值隨JVM運行的平臺不一樣而不一樣. |
-XX:G1ReservePercent=n |
設置堆內存保留爲假天花板的總量,以下降提高失敗的可能性. 默認值是 10. |
-XX:G1HeapRegionSize=n |
使用G1時Java堆會被分爲大小統一的的區(region)。此參數能夠指定每一個heap區的大小. 默認值將根據 heap size 算出最優解. 最小值爲1Mb, 最大值爲 32Mb. |
2.jvm日誌參數配置-Xmx10M -Xmn10M -XX:+PrintGCTimeStamps -XX:+UseG1GC -XX:+PrintGCDetails -Xloggc:./gclogs
3.最佳實踐
倘若經過 -Xmn 顯式地指定了年輕代的大小, 則會干擾到 G1收集器的默認行爲.
3.2 什麼是轉移失敗(Evacuation Failure)
對 survivors 或 promoted objects 進行GC時,若是JVM的heap區不足,就會發生提高失敗(promotion failure)。堆內存不能繼續擴充,由於已經達到最大值了。當使用 -XX:+PrintGCDetails 時將會在GC日誌中顯示 to-space overflow (to-空間溢出)。
GC仍繼續因此空間必須被釋放,拷貝失敗的對象必須被放到正確的位置(tenured in place),CSet指向區域中的任何 RSets 更新都必須從新生成(regenerated),全部這些步驟都是代價高昂的
3.3 如何避免轉移失敗(Evacuation Failure)
要避免避免轉移失敗, 考慮採納下列選項:
4日誌格式分析
4.1 日誌格式
3種日誌詳情格式:
2種時間戳格式:
-XX:+PrintGCDetails日誌示例:
0.522: [GC pause (young), 0.15877971 secs] // 程序運行0.522秒後發生一個Evacuation Pause,耗時0.15877971秒。
[Parallel Time: 157.1 ms] // 並行GC耗時157.1 ms
[GC Worker Start (ms): 522.1 522.2 522.2 522.2 // 每一個工做線程啓動時間,時間根據線程id排序
Avg: 522.2, Min: 522.1, Max: 522.2, Diff: 0.1] // 全部工做線程啓動時間的平均值、最小值、最大值、差異
[Ext Root Scanning (ms): 1.6 1.5 1.6 1.9 // 每一個掃描root的線程耗時
Avg: 1.7, Min: 1.5, Max: 1.9, Diff: 0.4]
[Update RS (ms): 38.7 38.8 50.6 37.3 // 每一個執行更新RS(Remembered Sets)的線程的耗時
Avg: 41.3, Min: 37.3, Max: 50.6, Diff: 13.3]
[Processed Buffers : 2 2 3 2 // 每一個工做線程執行UB(Update Buffers)的數量
Sum: 9, Avg: 2, Min: 2, Max: 3, Diff: 1]
[Scan RS (ms): 9.9 9.7 0.0 9.7 // 每一個工做線程掃描RS的耗時
Avg: 7.3, Min: 0.0, Max: 9.9, Diff: 9.9]
[Object Copy (ms): 106.7 106.8 104.6 107.9 // 每一個工做線程執行OC(Object Copy)的耗時
Avg: 106.5, Min: 104.6, Max: 107.9, Diff: 3.3]
[Termination (ms): 0.0 0.0 0.0 0.0 // 每一個工做線程執行終止的耗時
Avg: 0.0, Min: 0.0, Max: 0.0, Diff: 0.0]
[Termination Attempts : 1 4 4 6 // 每一個工做線程執行終止的重試的次數
Sum: 15, Avg: 3, Min: 1, Max: 6, Diff: 5]
[GC Worker End (ms): 679.1 679.1 679.1 679.1 // 每一個工做線程終止時的時間
Avg: 679.1, Min: 679.1, Max: 679.1, Diff: 0.1]
[GC Worker (ms): 156.9 157.0 156.9 156.9 // 每一個工做線程的生命時間
Avg: 156.9, Min: 156.9, Max: 157.0, Diff: 0.1]
[GC Worker Other (ms): 0.3 0.3 0.3 0.3 // 每一個工做線程執行其餘任務(上述未統計的內容)的耗時
Avg: 0.3, Min: 0.3, Max: 0.3, Diff: 0.0]
[Clear CT: 0.1 ms] // 清理CT(Card Table)的耗時
[Other: 1.5 ms] // 其餘任務(上述未統計的內容)的耗時
[Choose CSet: 0.0 ms] //選擇分區的耗時
[Ref Proc: 0.3 ms] // 執行關聯(Reference objects)的耗時
[Ref Enq: 0.0 ms] // 將references放入ReferenceQueues的耗時
[Free CSet: 0.3 ms] // 釋放CS(collection set)的耗時
[Eden: 12M(12M)->0B(10M) Survivors: 0B->2048K Heap: 13M(64M)->9739K(64M)] // Eden容量爲12M,使用了12M,GC後變爲0,容量目標大小增長到13M。
// SurvivorsGC前爲0,GC後變爲2048K
// GC前,Heap容量爲64M,使用13M;GC後,Heap容量爲64M,使用9739k。
[Times: user=0.59 sys=0.02, real=0.16 secs]