G1 GC總結


# G1 GC總結
# 在某些情況下,G1觸發了Full GC,這時G1會退化使用Serial收集器來完成垃圾的清理工作,它僅僅使用單線程來完成GC工作,GC暫停時間將達到秒級別的.整個應用處於假死狀態,不能處理任何請求
# 一.Full GC的情況: 
# 	1.並發模式失敗: G1啟動標記周期,但在Mix GC之前,老年代就被填滿,這時候G1會放棄標記周期.
#     	解決方法: 
#	    	a.增加堆大小
#       	b.調整周期(例如增加線程數-XX:ConcGCThreads等)
# 	2.晉升失敗或者疏散失敗: G1在進行GC的時候沒有足夠的內存供存活對象或晉升對象使用,由此觸發了Full GC.可以在日志中看到(to-space exhausted)或者(to-space overflow)
#     	解決方法: 
#	    a.增加 -XX:G1ReservePercent 選項的值(並相應增加總的堆大小),為“目標空間”增加預留內存量.
#       b.減少 -XX:InitiatingHeapOccupancyPercent 提前啟動標記周期.
#       c.增加 -XX:ConcGCThreads 選項的值來增加並行標記線程的數目.
# 	3.巨型對象分配失敗:當巨型對象找不到合適的空間進行分配時,就會啟動Full GC,來釋放空間.
#     	解決方法: 
# 			a.增加內存
#			b.增大-XX:G1HeapRegionSize,使巨型對象不再是巨型對象.
# 二.避免使用以下參數:
# 	避免使用 -Xmn 選項或 -XX:NewRatio 等其他相關選項顯式設置年輕代大小.固定年輕代的大小會覆蓋暫停時間目標.
# 三.使用場景:
# 	G1收集器首要關注的是為用戶運行着需要大堆空間、限制的垃圾回收延遲的應用提供一個解決方案.這意味着堆大小為6GB左右或者更大,穩定的、可預言的暫停時間小於0.5秒.
#   如果應用有以下一個或多個特點,當下運行着CMS或ParallelOldGC垃圾收集器的應用把收集器切換到G1收集器的話,非常適合:
# 		1.Full GC持續時間太長或者太頻繁
# 		2.對象分配比率或者提升有顯著的變化
# 		3.不期望的長時間垃圾收集或者壓縮暫停(大於0.5到1秒)

# 使用G1 GC
wrapper.java.additional.8=-XX:+UseG1GC

# 解鎖實驗性虛擬機標志
wrapper.java.additional.9=-XX:+UnlockExperimentalVMOptions

wrapper.java.additional.10=-XX:+UnlockDiagnosticVMOptions

# 設置的 G1 區域的大小.值是 2 的冪,范圍是 1 MB 到 32 MB 之間.目標是根據最小的 Java 堆大小划分出約 2048 個區域.
wrapper.java.additional.11=-XX:G1HeapRegionSize=8

# 為所需的最長暫停時間#設置目標值.默認值是 200 毫秒.如果MaxGCPauseMillis設置的過小,GC就會頻繁,吞吐量就會下降.如果MaxGCPauseMillis設置的過大,應用程序暫停時間就會變長.G1的默認暫停時間是200毫秒.
wrapper.java.additional.12=-XX:MaxGCPauseMillis=200

# 設置要用作年輕代大小最小值的堆百分比.默認值是 Java 堆的 5%.這是一個實驗性的標志.有關示例,請參見“如何解鎖實驗性虛擬機標志”.此#設置取代了 -XX:DefaultMinNewGenPercent 設置.Java HotSpot VM build 23 中沒有此設置.
wrapper.java.additional.13=-XX:G1NewSizePercent=5

# 設置要用作年輕代大小最大值的堆大小百分比.默認值是 Java 堆的 60%.這是一個實驗性的標志.此設置取代了 -XX:DefaultMaxNewGenPercent 設置.Java HotSpot VM build 23 中沒有此設置.
wrapper.java.additional.14=-XX:G1MaxNewSizePercent=60

# 設置 STW 工作線程數的值.將 n 的值#設置為邏輯處理器的數量.n 的值與邏輯處理器的數量相同,最多為 8.
# 如果邏輯處理器不止八個,則將 n 的值#設置為邏輯處理器數的 5/8 左右.這適用於大多數情況,除非是較大的 SPARC 系統,其中 n 的值可以是邏輯處理器數的 5/16 左右.
wrapper.java.additional.15=-XX:ParallelGCThreads=10

# 設置並行標記的線程數.將 n #設置為並行垃圾回收線程數 (ParallelGCThreads) 的 1/4 左右.
wrapper.java.additional.16=-XX:ConcGCThreads=8

# 設置觸發標記周期的 Java 堆占用率閾值.默認占用率是整個 Java 堆的 45%.
wrapper.java.additional.17=-XX:InitiatingHeapOccupancyPercent=45

# 為混合垃圾回收周期中要包括的舊區域設置占用率閾值.默認占用率為 65%.這是一個實驗性的標志.此設置取代了 -XX:G1OldCSetRegionLiveThresholdPercent 設置.Java HotSpot VM build 23 中沒有此設置.
wrapper.java.additional.18=-XX:G1MixedGCLiveThresholdPercent=65

# 設置您願意浪費的堆百分比.如果可回收百分比小於堆廢物百分比,Java HotSpot VM 不會啟動混合垃圾回收周期.默認值是 10%.Java HotSpot VM build 23 中沒有此設置.
wrapper.java.additional.19=-XX:G1HeapWastePercent=10

# 設置標記周期完成后,對存活數據上限為 G1MixedGCLIveThresholdPercent 的舊區域執行混合垃圾回收的目標次數.默認值是 8 次混合垃圾回收.混合回收的目標是要控制在此目標次數以內.Java HotSpot VM build 23 中沒有此設置.
wrapper.java.additional.20=-XX:G1MixedGCCountTarget=8

# 設置混合垃圾回收期間要回收的最大舊區域數.默認值是 Java 堆的 10%.Java HotSpot VM build 23 中沒有此設置.
wrapper.java.additional.21=-XX:G1OldCSetRegionThresholdPercent=10

# 設置作為空閑空間的預留內存百分比,以降低目標空間溢出的風險.默認值是 10%.增加或減少百分比時,請確保對總的 Java 堆調整相同的量.Java HotSpot VM build 23 中沒有此設置.
wrapper.java.additional.22=-XX:G1ReservePercent=10

# 手動開啟Java String對象的分割工作,這個是JDK8u20之后新增的參數,主要用於相同String避免重復申請內存,節約Region的使用;
wrapper.java.additional.23=-XX:+UseStringDeduplication

# 關閉GC時間過長系統自動檢測OOM(OutOfMemory)提示GC overhead limit exceeded,目的是顯示內存溢出異常,方便Wrapper Service檢測到並重啟
wrapper.java.additional.24=-XX:-UseGCOverheadLimit

#設置垃圾最大存活閥值.如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代.對於年老代比較多的應用,可以提高效率.如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論.默認值:15
wrapper.java.additional.25=-XX:MaxTenuringThreshold=3

# 取消 內存整理,G1GC 天生優勢 
wrapper.java.additional.26=-XX:-ResizePLAB

wrapper.java.additional.27=-XX:+PrintAdaptiveSizePolicy
wrapper.java.additional.28=-XX:+ParallelRefProcEnabled
wrapper.java.additional.29=-XX:+G1SummarizeConcMark

# 開啟GC日志
wrapper.java.additional.30=-verbose:gc 
wrapper.java.additional.31=-XX:+PrintGCDetails 
wrapper.java.additional.32=-XX:+PrintGCDateStamps 
wrapper.java.additional.33=-XX:+PrintGCApplicationStoppedTime # 打印應用停留時間 
wrapper.java.additional.34=-XX:+PrintTenuringDistribution # 老年代分布 
wrapper.java.additional.35=-Xloggc:../logs/gc.log 
wrapper.java.additional.36=-XX:+UseGCLogFileRotation 
wrapper.java.additional.37=-XX:NumberOfGCLogFiles=10 
wrapper.java.additional.38=-XX:GCLogFileSize=128M


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM