JVM(八)常見調優參數

堆大小設置

示例分析1

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

-Xms (設置初始化的java堆大小) -Xmx (設置java堆最大內存大小) -Xss (單個線程佔用的棧大小) -Xmn (年輕代的大小)java

  1. -Xms 和 -Xmx 的值相同,那麼初始化就是已經限制了java最大的內存大小
  2. 咱們這裏設置最大的大小還有年輕代的大小,那麼剩下的內存大小確定對年老帶有影響

示例分析2

-XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-XX:NewRatio=4:設置年輕代年輕代中Eden區與Survivor區的大小比值。設置爲4,則兩個Survivor區與一個Eden區的比值爲2:4,一個Survivor區佔整個年輕代的1/6 -XX:MaxPermSize=16m:設置(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置爲4,則年輕代與年老代所佔比值爲1:4,年輕代佔整個堆棧的1/5 -XX:SurvivorRatio=4:設置持久代大小爲16m。 -XX:MaxTenuringThreshold 設置通過多少代回收升至年老代vim

回收器的選擇

JVM給了三種選擇:串行收集器、並行收集器、併發收集器,可是串行收集器只適用於小數據量的狀況,因此這裏的選擇主要針對並行收集器和併發收集器。默認狀況下,JDK5.0之前都是使用串行收集器,若是想使用其餘收集器須要在啓動時加入相應參數。JDK5.0之後,JVM會根據當前系統配置進行判斷。併發

吞吐量優先的並行收集器

示例分析1

java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20

-XX:+UseParallelGC:選擇垃圾收集器爲並行收集器。此配置僅對年輕代有效。即上述配置下,年輕代使用併發收集,而年老代仍舊使用串行收集。 -XX:ParallelGCThreads=20:配置並行收集器的線程數,即:同時多少個線程一塊兒進行垃圾回收。此值最好配置與處理器數目相等。jvm

示例分析2

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC

-XX:+UseParallelOldGC: 配置年老代垃圾收集方式爲並行收集。JDK6.0支持對年老代並行收集。性能

示例分析3

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy

-XX:+UseAdaptiveSizePolicy:設置此選項後,並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用並行收集器時,一直打開。測試

響應時間優先的併發收集器

示例分析1

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

-XX:+UseConcMarkSweepGC:設置年老代爲併發收集。spa

示例分析2

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction:因爲併發收集器不對內存空間進行壓縮、整理,因此運行一段時間之後會產生「碎片」,使得運行效率下降。此值設置運行多少次GC之後對內存空間進行壓縮、整理。 -XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性能,可是能夠消除碎片線程

輔助信息

 -XX:+PrintGC : 打印GC 

 -XX:+PrintGCDetails : 詳細一點的信息

 -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期間程序暫停的時間。

 -Xloggc:filename:與上面幾個配合使用,把相關日誌信息記錄到文件以便分析。

例如一個使用示例 :unix

[root@xx jvm測試]# java -XX:+PrintGCDetails -Xloggc:jvmLog.txt DynamicDispatch 
man say hello
woman say hello
woman say hello

[root@xx jvm測試]# ls
'DynamicDispatch$Human.class'  'DynamicDispatch$Woman.class'   DynamicDispatch.java   hs_err_pid14941.log   StaticResolution.class
'DynamicDispatch$Man.class'     DynamicDispatch.class          hello.jar              jvmLog.txt            StaticResolution.java

[root@xx jvm測試]# vim jvmLog.txt 

補充

如何分析GC日誌

Young GC日誌: 1297993-20200415144935978-1256825494.png日誌

Full GC日誌:

1297993-20200415144953890-141586730.png

調優總結

jvm 調優的參數主要從如下幾個方面 :

  • 堆設置調整
  • 串行並行收集器的選擇

參考資料

  • https://www.iteye.com/blog/unixboy-174173 (必看)
  • https://www.one-tab.com/page/l6WE1xp_TDyEN5iQNVyOEA
相關文章
相關標籤/搜索