記一次STS.ini參數調優--合理設置JVM參數值

個人的sts.ini方案以及後面的詳細說明

sts.ini方案:

-startup
plugins/org.eclipse.equinox.launcher_1.5.400.v20190515-0925.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1000.v20190125-2016
-product
org.springsource.sts.ide
--launcher.defaultAction
openFile
#JVM路徑
-vm
D:\Java\jdk\jdk1.8.0_221\jre\bin\server\jvm.dll
#JVM參數設置
-vmargs
-Dosgi.requiredJavaVersion=1.8
--add-modules=ALL-SYSTEM
-Dosgi.module.lock.timeout=10
-Dorg.eclipse.swt.browser.IEVersion=10001
#JVMGC詳情輸出
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:D:\Java\jdk\gclog\gc.log
#一般設置-Xms、-Xmx相等以避免在每次GC 後調整堆的大小
#初始堆內存
-Xms2048m
#最大堆內存
-Xmx2048m
#年輕代堆內存
-Xmn1536m
#元空間初始大小
-XX:MetaspaceSize=128m
#最大元空間大小
-XX:MaxMetaspaceSize=1024m
#取消字節碼校驗,加快JVM類加載
-Xverify:none
#方法調用100次會被編譯成本地機器碼
-XX:CompileThreshold=100
#使用併發內存回收
-XX:+UseParallelGC
#禁止RMI(Java遠程方法調用)調用System.gc,因爲System.gc可能會觸發FULL GC
-XX:+DisableExplicitGC
#配置並行收集器的線程數
-XX:ParallelGCThreads=4

優化說明:

1.使用-vm參數設置JVM路徑

-vm
D:\Java\jdk\jdk1.8.0_221\jre\bin\server\jvm.dll

2.調整JVM堆內存以及元空間大小

首先將JVM的GC詳情輸出到日誌中:

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:D:\Java\jdk\gclog\gc.log

查看GC日誌。

2019-08-12T09:42:00.092+0800: 3.176: [GC (Metadata GC Threshold) [PSYoungGen: 754975K->54895K(1376256K)] 754975K->55119K(1900544K), 0.0484245 secs] [Times: user=0.25 sys=0.02, real=0.05 secs] 
2019-08-12T09:42:00.140+0800: 3.225: [Full GC (Metadata GC Threshold) [PSYoungGen: 54895K->0K(1376256K)] [ParOldGen: 224K->53437K(524288K)] 55119K->53437K(1900544K), [Metaspace: 18797K->18797K(1069056K)], 0.1167065 secs] [Times: user=0.58 sys=0.02, real=0.12 secs] 
2019-08-12T09:42:01.958+0800: 5.042: [GC (Metadata GC Threshold) [PSYoungGen: 419142K->28800K(1376256K)] 472579K->82246K(1900544K), 0.0269177 secs] [Times: user=0.14 sys=0.00, real=0.03 secs] 
2019-08-12T09:42:01.985+0800: 5.069: [Full GC (Metadata GC Threshold) [PSYoungGen: 28800K->0K(1376256K)] [ParOldGen: 53445K->61105K(524288K)] 82246K->61105K(1900544K), [Metaspace: 31810K->31810K(1079296K)], 0.0913621 secs] [Times: user=0.38 sys=0.02, real=0.09 secs] 
2019-08-12T09:42:08.064+0800: 11.148: [GC (Metadata GC Threshold) [PSYoungGen: 718732K->42937K(1376256K)] 779838K->104051K(1900544K), 0.0254809 secs] [Times: user=0.06 sys=0.00, real=0.02 secs] 
2019-08-12T09:42:08.089+0800: 11.174: [Full GC (Metadata GC Threshold) [PSYoungGen: 42937K->0K(1376256K)] [ParOldGen: 61113K->94403K(524288K)] 104051K->94403K(1900544K), [Metaspace: 52351K->52351K(1099776K)], 0.4184534 secs] [Times: user=1.30 sys=0.00, real=0.42 secs] 
2019-08-12T09:42:15.203+0800: 18.286: [GC (Allocation Failure) [PSYoungGen: 1179648K->42136K(1376256K)] 1274051K->136548K(1900544K), 0.0419592 secs] [Times: user=0.09 sys=0.00, real=0.04 secs] 
2019-08-12T09:42:15.862+0800: 18.946: [GC (Metadata GC Threshold) [PSYoungGen: 243269K->31185K(1376256K)] 337681K->125605K(1900544K), 0.0245842 secs] [Times: user=0.13 sys=0.00, real=0.03 secs] 
2019-08-12T09:42:15.887+0800: 18.971: [Full GC (Metadata GC Threshold) [PSYoungGen: 31185K->0K(1376256K)] [ParOldGen: 94419K->107256K(524288K)] 125605K->107256K(1900544K), [Metaspace: 88351K->88348K(1134592K)], 0.2870267 secs] [Times: user=0.88 sys=0.00, real=0.29 secs] 

我們應該如何去分析GC日誌呢?

2019-08-12T09:42:01.985+0800(當前時間戳): 5.069: [Full GC(GC類型) (Metadata GC Threshold(發生GC的原因)) [PSYoungGen(年輕代回收): 28800K(年輕代回收前的大小)->0K(年輕代回收後的大小)(1376256K)(年輕代總大小)] [ParOldGen(老年代回收): 53445K(老年代回收前的大小)->61105K(老年代回收後的大小)(524288K)(老年代總大小)] 82246K(堆內存回收前大小)->61105K(堆內存回收後大小)(1900544K(堆內存總大小)), [Metaspace(元空間回收): 31810K(元空間回收前大小)->31810K(元空間回收後大小)(1079296K)(元空間總大小)], 0.0913621 secs(回收時間)] [Times: user=0.38(用戶耗時) sys=0.02(系統耗時), real=0.09 (實際耗時)secs]

調試的原則:避免JVM中的FULL GC的發生,因爲FULL GC會引起老年代的垃圾回收,而老年代的垃圾回收耗時耗力。同時根據電腦的內存適當增加堆內存的大小。調整後各區域內存大小:

#初始堆內存
-Xms2048m
#最大堆內存
-Xmx2048m
#年輕代
-Xmn1536m
#元空間
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=1024m

注:JDK 1.8 JVM結構發生改變,元空間(Metaspace)取代永久代(PermGen)。因此JDK1.8之前應該調整永久代的大小,而JDK1.8以後調整元空間的大小。

JDK1.8之前版本參數優化舉例:

-Xms2048m
-Xmx2048m
-Xmn1536m
#永久代
-XX:PermSize=128m
-XX:MaxPermSize=1024m

3.關閉字節碼校驗

#取消字節碼校驗,加快JVM類加載
-Xverify:none

4.配置並行垃圾回收

#使用併發內存回收
-XX:+UseParallelGC
#配置並行收集器的線程數
-XX:ParallelGCThreads=4

5.禁止代碼中顯示調用GC

#禁止RMI(Java遠程方法調用)調用System.gc,因爲System.gc可能會觸發FULL GC
-XX:+DisableExplicitGC

注:NIO直接內存的回收,需要依賴於System.gc()。如果我們的應用中使用了java nio中的direct memory,那麼使用-XX:+DisableExplicitGC要小心,存在潛在的內存泄露風險。

6.確定編譯器閾值,控制編譯的條件

#方法調用100次會被編譯成本地機器碼
-XX:CompileThreshold=100

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章