JDK8生產引數的學習與整理

济南小老虎發表於2024-05-01

JDK8生產引數的學習與整理


背景

五一期間加班整理一下用到的一些引數資訊. 

希望能夠繼續鞏固自己的知識. 
希望下次總結時能夠新增上更多東西

產品的啟動時增加的引數

-javaagent:./jmx_prometheus_javaagent-0.17.2.jar=8080:simple-config.yml
 -Xms20G -Xmx20G -Xmn10G 
 -XX:-DisableExplicitGC -XX:+PrintGC -XX:+PrintGCDateStamps 
 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gclog-%t.log 
 -XX:+HeapDumpOnOutOfMemoryError  
 -XX:InitialCodeCacheSize=2G  -XX:ReservedCodeCacheSize=2G  
 -XX:MaxMetaspaceSize=4G  
 -XX:NativeMemoryTracking=detail  

引數解釋-agent

-javaagent:./jmx_prometheus_javaagent-0.17.2.jar=8080:simple-config.yml

jvm的 exporter  可以監控啟動過程中的使用情況. 
透過這個agent 可以看到部分詳細資訊. 

引數解釋-記憶體部分

 -Xms20G -Xmx20G -Xmn10G 
設定 堆區的最大值和最小值都是20G
設定青年代 大小是10G

jvm 有一個自動調節的演算法. 
如果最大最小記憶體值不一樣, 他會自動收縮堆區的總區域
此時會導致作業系統的介入, 出現效能衰退
所以建議 最大區和最小區保持一致. 避免記憶體回收引起波動.

設定青年代為10G
預設的jdk8 青年代: 老年代 的比率是 1 : 2
20G堆區的話 就是 7G左右的青年代和14G左右的老年代

-Xmn 設定青年代為10G, 那麼老年代也是10G 比率基本上為 1:1

這樣修改的意圖是: 
透過增加青年代的大小, 降低Young GC的頻率
從來將 能夠撐過15次 Young GC的到達老年大的記憶體物件
降低總的GC時間(青年代+老年代)
從來提高效能和吞吐率.

換句話說 在總堆區不變的情況下, 減少老年代有助於減少FullGC的頻率
雖然有點反常識, 但是實際情況確實如此. 

引數解釋-gc部分

 -XX:-DisableExplicitGC -XX:+PrintGC -XX:+PrintGCDateStamps 
 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gclog-%t.log 
 -XX:+HeapDumpOnOutOfMemoryError  
禁止 system.gc() 避免有人手賤 寫到產品裡面去.
列印 GC的資訊, 可以使用 GCeasy等工具進行分析.
設定gc的檔案, 增加時間戳命令, 避免被覆蓋- 注意需要定期清理日誌. 
設定 OOM時自動轉儲成dump檔案, 便於分析. 

引數解釋-非堆區

 -XX:InitialCodeCacheSize=2G  -XX:ReservedCodeCacheSize=2G  
 -XX:MaxMetaspaceSize=4G  
 -XX:NativeMemoryTracking=detail  

增加方法區大小. 避免 C2過分佔用CPU
增加後設資料區域限制, 避免無限制的佔用記憶體
增加NMT監控, 便於分析記憶體的整天佔用. 

堆區與作業系統記憶體使用的關係

堆區 使用 20G的配置
但是透過作業系統和 JVM的 exporter 監控發現
記憶體使用在 27.1G-27.5G
推測. 產品可能會影響較多的非堆區. 
但是同時監控非堆區僅有 2.6G記憶體
所以懷疑有 5G記憶體可能是 棧區. 本地方法以及其他記憶體區域
這一塊可能需要較長時間進行驗證. 

相關文章