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記憶體可能是 棧區. 本地方法以及其他記憶體區域
這一塊可能需要較長時間進行驗證.