java--jvm GC-常用參數配置


 

一、GC-常用參數配置

1.通用參數
-Xms 堆內存初始大小(默認為物理內存的1/64(<1GB);默認(MinHeapFreeRatio參數可以調整)空余堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制),是指設定程序啟動時占用內存大小。一般來講,大點,程序會啟動的快一點,但是也可能會導致機器暫時間變慢。


-Xmx 堆內存最大大小(默認(MaxHeapFreeRatio參數可以調整)空余堆內存大於70%時,JVM會減少堆直到 -Xms的最小限制),是指設定程序運行期間最大可占用的內存大小,如果程序運行需要占用更多的內存,超出了這個設置值,就會拋出OutOfMemory異常。

 

-Xmn  新生代大小  (注意:此處的大小是(eden+ 2 survivor space)。與jmap -heap中顯示的New gen是不同的。整個堆大小=新生代大小 + 老生代大小 + 永久代大小。在保證堆大小不變的情況下,增大新生代后,將會減小老生代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。)

-Xss 線程大小(每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。應根據應用的線程所需內存大小進行適當調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。一般小的應用, 如果棧不是很深, 應該是128k夠用的,大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。和threadstacksize選項解釋很類似,官方文檔似乎沒有解釋,在論壇中有這樣一句話:"-Xss is translated in a VM flag named ThreadStackSize”一般設置這個值就可以了。),是指設定每個線程的堆棧大小。這個就要依據你的程序,看一個線程大約需要占用多少內存,可能會有多少線程同時運行等。


-XX:+UserG1GC         指定使用G1垃圾回收器
-XX:SurvivorRatio       eden區和一個survivor區比例 eden/survivor 注意S區有兩個(新生代中Eden區域與Survivor區域的容量比值,默認值為8。兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個年輕代的1/10。)
-XX:MaxTenuringThreshold 新生代進入老年代的年齡(即在新生代躲過了幾次GC)

-XX:-UseAdaptiveSizePolicy 關閉Survivor區大小動態變化

-XX:PretenureSizeThreshold 大對象直接晉升老年代閾值

-XX:+DisableExplicitGC 禁止顯示執行GC 不允許代碼觸發GC 例如 System.gc()

 

 

2. OOM
-XX:+HeapDumpOnOutOfMemoryError 表示當JVM發生OOM時,自動生成DUMP文件。

-XX:HeapDumpPath=${目錄} 表示生成DUMP文件的路徑,也可以指定文件名稱

示例:

  java -server -Xms7g -Xmx7g -Xmn1792m -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m -Dfile.encoding=UTF-8
 -XX:+UseG1GC -XX:MaxGCPauseMillis=200
-XX:+ParallelRefProcEnabled -Xloggc:/workspace/carkey/AppHelloOpenApiService/latest//logs/gc.log -XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/workspace/carkey/AppHelloOpenApiService/latest//logs/heapdump.hprof
  

 

 

3. GC日志

-XX:+PrintGC 輸出簡要GC日志
-XX:+PrintGCDetails 輸出詳細GC日志
-Xloggc:gc.log 輸出GC日志到文件,將gc日志輸出到log文件
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以JVM啟動到當期的總時長的時間戳形式,相對於jvm啟動時間,毫秒時間。)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800,日期時間)可以了解這些垃圾收集發生的時間,自JVM啟動以后以秒計量。
-XX:+PrintHeapAtGC 在進行GC的前后打印出堆的信息,每次一次GC后,都打印堆信息,解堆的更詳細的信息。
-verbose:gc 
-XX:+PrintReferenceGC 打印年輕代各個引用的數量以及時長

-XX:+PrintGCApplicationStoppedTime 輸出GC造成應用暫停的時間

 

示例:

java -server -Xms7g -Xmx7g -Xmn1792m -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m -Dfile.encoding=UTF-8
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
-XX:+ParallelRefProcEnabled
-Xloggc:/workspace/carkey/AppHelloOpenApiService/latest//logs/gc.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/workspace/carkey/AppHelloOpenApiService/latest//logs/heapdump.hprof

  

 

4. CMS回收器:


-XX:+UseConcMarkSweepGC  啟用CMS回收器

-XX:CMSInitiatingOccupancyFaction 指定老年代的空間使用率達到xx觸發full gc 因為並發收集的時候可能會有新對象進入老年代

-XX:+UserCMSCompactAtFullCollection 使用CMS觸發Full GC之后進行壓縮 (避免內存碎片)

-XX:CMSFullGCBeforeCompaction 執行多少次Full GC后進行壓縮 默認0

-XX:+CMSParallelInitialMarkEnabled CMS回收”初始標記“階段開啟多線程並發執行

-XX:CMSScavengeBeforeRemark 在CMS”重新標記“階段之前 盡量執行一次Young GC

 

5. G1回收器


-XX:+UserG1GC 指定使用G1辣雞回收器
-XX:G1HeapRegionSize 指定Region的大小
-XX:G1NewSizePercent 設置新生代初始占比 默認5%
-XX:MaxTenuringThreshold 新生代進入老年代的年齡(即在新生代躲過了幾次GC)
-XX:InitiatingHeapOccupancyPercent 老年代占據了堆內存的Percent%時,就會嘗試觸發一個新生代+老生代一期回收的混合回收階段 即Mixed GC 默認值45%
-XX:MaxGCPauseMills G1執行GC的時候最多可以讓系統停頓多長時間 默認200ms
-XX:G1MixedGCCountTarget 在一次混合回收的過程中,最后一個階段執行混合回收的次數 默認8次
-XX:G1HeapWastePercent 當空閑的Region數量達到了堆內存的Percent%,此時就會立即停止混合回收,意味着本次混合回收就結束了 默認值5%(在混合回收的時候,對Region回收都是基於復制算法進行的,都是把要回收的Region里的存活對象放入其他region,然后這個Region中的垃圾對象全部清理調,這樣的話在回收過程就會不斷空出來新的Region)
-XX:G1MixedGCLiveThresholdPercent 回收Region時,必須是存活對象低於Percent%的Region才可以進行回收 默認85% (如果存活對象過多,復制算法成本會很高)

 

java -server -Xms7g -Xmx7g -Xmn1792m -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m -Dfile.encoding=UTF-8
 -XX:+UseG1GC -XX:MaxGCPauseMillis=200
 -XX:+ParallelRefProcEnabled -Xloggc:/workspace/carkey/AppHelloOpenApiService/latest//logs/gc.log -XX:+PrintGCDateStamps 
 -XX:+PrintGCDetails 
 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/workspace/carkey/AppHelloOpenApiService/latest//logs/heapdump.hprof 

 

6. 元數據區


-XX:TraceClassLoading :追蹤類加載

-XX:TraceClassUnloading: 追蹤類卸載

 

7.永久代 perm gen 

  • -XX:PermSize:設置永久代(perm gen)初始值。默認值為物理內存的1/64。
  • -XX:MaxPermSize:設置持久代最大值。物理內存的1/4。

    為了避免Perm區滿引起的full gc,建議開啟CMS回收Perm區選項:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

 

    默認CMS是在tenured generation(老年代)沾滿68%的時候開始進行CMS收集,如果你的年老代增長不是那么快,並且希望降低CMS次數的話,可以適當調高此值:-XX:CMSInitiatingOccupancyFraction=80

     遇到兩種fail引起full gc:Prommotion failed和Concurrent mode failed時:

      

 

 

 

   

8. 大量反射場景


-XX:SoftRefLRUPolicyMSPerMB 提高這個數值就是讓反射過程中JVM自動創建的軟引用的一些類的class對象不要被隨便回收

 

 加上自己的一些筆記

補充:

MetaspaceSize和MaxMetaspaceSize的理解

 -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m

  • MaxMetaspaceSize用於設置metaspace區域的最大值,這個值可以通過mxbean中的MemoryPoolBean獲取到,如果這個參數沒有設置,那么就是通過mxbean拿到的最大值是-1,表示無窮大。
  • MetaspaceSize表示metaspace首次使用不夠而觸發FGC的閾值,只對觸發起作用,原因是:垃圾搜集器內部是根據變量_capacity_until_GC來判斷metaspace區域是否達到閾值的,初始化代碼如下所示:

 
 

 

 
二、示例下面對如下的參數進行分析:
JAVA_OPTS="-server -Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:SurvivorRatio=4
-verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log 
-Djava.awt.headless=true 
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails 
-Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000
-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15"

  

解析:

Xms,即為jvm啟動時得JVM初始堆大小,Xmx為jvm的最大堆大小,xmn為新生代的大小,permsize為永久代的初始大小,MaxPermSize為永久代的最大空間。

 

 

 

 

 

 

java -server -Xms7g -Xmx7g -Xmn1792m -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m 
-Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled
-Xloggc:/workspace/carkey/AppHelloOpenApiService/latest//logs/gc.log -XX:+PrintGCDateStamps
-XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/workspace/carkey/AppHelloOpenApiService/latest//logs/heapdump.hprof

 

三、java啟動參數共分為三類


其一是標准參數(-),所有的JVM實現都必須實現這些參數的功能,而且向后兼容;
其二是非標准參數(又稱為擴展參數 )(-X),默認jvm實現這些參數的功能,但是並不保證所有jvm實現都滿足,且不保證向后兼容;
其三是非Stable參數(-XX),此類參數各個jvm實現會有所不同,將來可能會隨時取消,需要慎重使用;

 一、標准參數(-)

標准參數(-),所有的JVM實現都必須實現這些參數的功能,而且向后兼容;

標准參數中比較有用的:

verbose 
-verbose:class
 

 輸出jvm載入類的相關信息,當jvm報告說找不到類或者類沖突時可此進行診斷。
-verbose:gc 
 輸出每次GC的相關情況。
-verbose:jni 
 輸出native方法調用的相關情況,一般用於診斷jni調用錯誤信息。

二、非標准參數又稱為擴展參數 (-X):

一般用到最多的是

-Xms512m  設置JVM最小可用內存為512m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。

-Xmx512m ,設置JVM最大可用內存為512m。

-Xmn200m設置年輕代大小為200M。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。

-Xss128k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。

-Xloggc:file
 與-verbose:gc功能類似,只是將每次GC事件的相關情況記錄到一個文件中,文件的位置最好在本地,以避免網絡的潛在問題。
 若與verbose命令同時出現在命令行中,則以-Xloggc為准。
-Xprof

 跟蹤正運行的程序,並將跟蹤數據在標准輸出輸出;適合於開發環境調試。

示例:

java -server -Xms7g -Xmx7g -Xmn1792m -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -Xloggc:/workspace/carkey/AppHelloOpenApiService/latest//logs/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/workspace/carkey/AppHelloOpenApiService/latest//logs/heapdump.hprof -Dcom.sun.management.jmxremote.port=5555 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote=true -DAPPID=AppHelloOpenApiService -DbasicConf.host=https://pt-basicconf.hellobike.cn -Dapollo.meta=http://pt-apollometa.hellobike.cn:10080 -Dsoa.group=online_test -Dsoa.register.url=pt-soazk1.hellobike.cn:2181,pt-soazk2.hellobike.cn:2181,pt-soazk3.hellobike.cn:2181 -Dsoa.auth.url=https://pt-basicconf.hellobike.cn -Dsoa.server.tag.ignore=false -Dsoa.server.tag.mandatory=false -Dowl.metrics.kafka.servers=pt-kafka1.ttbike.com.cn:9092,pt-kafka2.ttbike.com.cn:9092 -Denv=pt -Dsoa.server.port=80 -Djava.io.tmpdir=/workspace/carkey/AppHelloOpenApiService/latest//temp/ -Duser.dir=/workspace/carkey/AppHelloOpenApiService/latest/ -Dproject.name=open-api -Dcsp.sentinel.config.file=classpath:sentinel.properties -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -classpath /workspace/carkey/AppHelloOpenApiService/latest//conf:/workspace/carkey/AppHelloOpenApiService/latest//lib/*: com.hellobike.openapi.deploy.OpenApiApplication

  

三、非Stable參數(-XX)

此類參數各個jvm實現會有所不同,將來可能會隨時取消,需要慎重使用;

用-XX作為前綴的參數列表在jvm中可能是不健壯的,SUN也不推薦使用,后續可能會在沒有通知的情況下就直接取消了;但是由於這些參數中的確有很多是對我們很有用的,比如我們經常會見到的-XX:PermSize、-XX:MaxPermSize等等;

 

首先來介紹行為參數

 

參數及其默認值

描述

-XX:-DisableExplicitGC

禁止調用System.gc();但jvm的gc仍然有效

-XX:+MaxFDLimit

最大化文件描述符的數量限制

-XX:+ScavengeBeforeFullGC

新生代GC優先於Full GC執行

-XX:+UseGCOverheadLimit

在拋出OOM之前限制jvm耗費在GC上的時間比例

-XX:-UseConcMarkSweepGC

對老生代采用並發標記交換算法進行GC

-XX:-UseParallelGC

啟用並行GC

-XX:-UseParallelOldGC

對Full GC啟用並行,當-XX:-UseParallelGC啟用時該項自動啟用

-XX:-UseSerialGC

啟用串行GC

-XX:+UseThreadPriorities

啟用本地線程優先級

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

上面表格中黑體的三個參數代表着jvm中GC執行的三種方式,即串行、並行、並發
串行SerialGC是jvm的默認GC方式,一般適用於小型應用和單處理器,算法比較簡單,GC效率也較高,但可能會給應用帶來停頓;
並行ParallelGC是指GC運行時,對應用程序運行沒有影響,GC和app兩者的線程在並發執行,這樣可以最大限度不影響app的運行;
並發ConcMarkSweepGC是指多個線程並發執行GC,一般適用於多處理器系統中,可以提高GC的效率,但算法復雜,系統消耗較大;

 

性能調優參數列表:

參數及其默認值

描述

-XX:LargePageSizeInBytes=4m

設置用於Java堆的大頁面尺寸

-XX:MaxHeapFreeRatio=70

GC后java堆中空閑量占的最大比例

-XX:MaxNewSize=size

新生成對象能占用內存的最大值

-XX:MaxPermSize=64m

老生代對象能占用內存的最大值

-XX:MinHeapFreeRatio=40

GC后java堆中空閑量占的最小比例

-XX:NewRatio=2

新生代內存容量與老生代內存容量的比例

-XX:NewSize=2.125m

新生代對象生成時占用內存的默認值

-XX:ReservedCodeCacheSize=32m

保留代碼占用的內存容量

-XX:ThreadStackSize=512

設置線程棧大小,若為0則使用系統默認值

-XX:+UseLargePages

使用大頁面內存

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 我們在日常性能調優中基本上都會用到以上黑體的這幾個屬性; 

 

調試參數列表:

 

參數及其默認值

描述

-XX:-CITime

打印消耗在JIT編譯的時間

-XX:ErrorFile=./hs_err_pid<pid>.log

保存錯誤日志或者數據到文件中

-XX:-ExtendedDTraceProbes

開啟solaris特有的dtrace探針

-XX:HeapDumpPath=./java_pid<pid>.hprof

指定導出堆信息時的路徑或文件名

示例:-XX:HeapDumpPath=/workspace/carkey/AppHelloOpenApiService/latest//logs/heapdump.hprof

-XX:-HeapDumpOnOutOfMemoryError

當首次遭遇OOM時導出此時堆中相關信息

示例:-XX:+HeapDumpOnOutOfMemoryError

-XX:OnError="<cmd args>;<cmd args>"

出現致命ERROR之后運行自定義命令

-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

當首次遭遇OOM時執行自定義命令

-XX:-PrintClassHistogram

遇到Ctrl-Break后打印類實例的柱狀信息,與jmap -histo功能相同

-XX:-PrintConcurrentLocks

遇到Ctrl-Break后打印並發鎖的相關信息,與jstack -l功能相同

-XX:-PrintCommandLineFlags

打印在命令行中出現過的標記

-XX:-PrintCompilation

當一個方法被編譯時打印相關信息

-XX:-PrintGC

每次GC時打印相關信息

-XX:-PrintGC Details

每次GC時打印詳細信息

-XX:-PrintGCTimeStamps

打印每次GC的時間戳

-XX:-TraceClassLoading

跟蹤類的加載信息

-XX:-TraceClassLoadingPreorder

跟蹤被引用到的所有類的加載信息

-XX:-TraceClassResolution

跟蹤常量池

-XX:-TraceClassUnloading

跟蹤類的卸載信息

-XX:-TraceLoaderConstraints

跟蹤類加載器約束的相關信息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

參考文檔:https://blog.csdn.net/lbh199466/article/details/103144831/

             https://www.cnblogs.com/junzi2099/p/7827448.html

              http://xstarcd.github.io/wiki/Java/JVM_GC.html

 

 


免責聲明!

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



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