CMS GC啟動參數優化配置


簡介:

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

-XX:+<option> 啟用option,例如:-XX:+PrintGCDetails啟動打印GC信息的選項,其中+號表示true,開啟的意思
-XX:-<option> 不啟用option,例如:-XX:-PrintGCDetails關閉啟動打印GC信息的選項,其中-號表示false,關閉的意思
-XX:<option>=<number> 設定option的值為數字類型,可跟單位,例如 32k, 1024m, 2g。例如:-XX:MaxPermSize=64m
-XX:<option>=<string> 設定option的值為字符串,例如: -XX:HeapDumpPath="C:\Users\Daxin\Desktop\jvmgcin"

設置:

1.設置環境變量JAVA_OPTS

2.Windows下,在/bin/catalina.bat,Unix下,在/bin/catalina.sh的前面,增加 JAVA_OPTS=’-Xms256m -Xmx512m’

Tomcat 的啟動參數位於安裝目錄 ${TOMCAT_HOME}/bin目錄下,Linux 操作系統就是 catalina.sh 文件。JAVA_OPTS,就是用來設置 JVM 相關運行參數的變量,還可以在 CATALINA_OPTS 變量中設置。關於這 2 個變量,還是多少有些區別的:

JAVA_OPTS:用於當 Java 運行時選項“start”、“stop”或“run”命令執行。

CATALINA_OPTS:用於當 Java 運行時選項“start”或“run”命令執行。

為什么有兩個不同的變量?它們之間都有什么區別呢?

首先,在啟動 Tomcat 時,任何指定變量的傳遞方式都是相同的,可以傳遞到執行“start”或“run”命令中,但只有設定在 JAVA_OPTS 變量里的參數被傳遞到“stop”命令中。對於 Tomcat 運行過程,可能沒什么區別,影響的是結束程序,而不是啟動程序。

第二個區別是更微妙,其他應用程序也可以使用 JAVA_OPTS 變量,但只有在 Tomcat 中使用 CATALINA_OPTS 變量。如果你設置環境變量為只使用 Tomcat,最好你會建議使用 CATALINA_OPTS 變量,而如果你設置環境變量使用其它的 Java 應用程序,例如 JBoss,你應該把你的設置放在JAVA_OPTS 變量中。

參數:

我在本地配置的:

-server                                             ## 服務器模式
-Xms2g                                              ## 初始化堆內存大小
-Xmx2g                                              ## 堆內存最大值
-Xmn256m                                            ## 年輕代內存大小,整個JVM內存=年輕代 + 年老代 + 持久代
-Xss256k                                            ## 設置每個線程的堆棧大小
-XX:PermSize=256m                                   ## 持久代內存大小
-XX:MaxPermSize=256m                                ## 最大持久代內存大小
-XX:ReservedCodeCacheSize=256m                      ## 代碼緩存,存儲已編譯方法生成的本地代碼
-XX:+UseCodeCacheFlushing                           ## 代碼緩存滿時,讓JVM放棄一些編譯代碼
-XX:+DisableExplicitGC                              ## 忽略手動調用GC, System.gc()的調用就會變成一個空調用,完全不觸發GC
-Xnoclassgc                                         ## 禁用類的垃圾回收,性能會高一點
-XX:+UseConcMarkSweepGC                             ## 並發標記清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled                       ## 啟用並行標記,降低標記停頓
-XX:+UseParNewGC                                    ## 對年輕代采用多線程並行回收,這樣收得快
-XX:+UseCMSCompactAtFullCollection                  ## 在FULL GC的時候對年老代的壓縮,Full GC后會進行內存碎片整理,過程無法並發,空間碎片問題沒有了,但提頓時間不得不變長了
-XX:CMSFullGCsBeforeCompaction=3                    ## 多少次Full GC 后壓縮old generation一次
-XX:LargePageSizeInBytes=128m                       ## 內存頁的大小
-XX:+UseFastAccessorMethods                         ## 原始類型的快速優化
-XX:+UseCMSInitiatingOccupancyOnly                  ## 使用設定的回收閾值(下面指定的70%)開始CMS收集,如果不指定,JVM僅在第一次使用設定值,后續則自動調整
-XX:CMSInitiatingOccupancyFraction=70               ## 使用cms作為垃圾回收使用70%后開始CMS收集
-XX:SoftRefLRUPolicyMSPerMB=50                      ## Soft reference清除頻率,默認存活1s,設置為0就是不用就清除
-XX:+AlwaysPreTouch                                 ## 強制操作系統把內存真正分配給JVM
-XX:+PrintClassHistogram                            ## 按下Ctrl+Break后,打印類的信息
-XX:+PrintGCDetails                                 ## 輸出GC詳細日志
-XX:+PrintGCTimeStamps                              ## 輸出GC的時間戳(以基准時間的形式)
-XX:+PrintHeapAtGC                                  ## 在進行GC的前后打印出堆的信息
-XX:+PrintGCApplicationConcurrentTime               ## 輸出GC之間運行了多少時間
-XX:+PrintTenuringDistribution                      ## 參數觀察各個Age的對象總大小
-XX:+PrintGCApplicationStoppedTime                  ## GC造成應用暫停的時間
-Xloggc:../log/gc.log                               ## 指定GC日志文件的輸出路徑
-ea                                                 ## 打開斷言機制,jvm默認關閉
-Dsun.io.useCanonCaches=false                       ## java_home沒有配置,或配置錯誤會報異常
-Dsun.awt.keepWorkingSetOnMinimize=true             ## 可以讓IDEA最小化到任務欄時依然保持以占有的內存,當你重新回到IDEA,能夠被快速顯示,而不是由灰白的界面逐漸顯現整個界面,加快回復到原界面的速度
-Djava.net.preferIPv4Stack=true                     ## 讓tomcat默認使用IPv4
-Djdk.http.auth.tunneling.disabledSchemes=""        ## 等於Basic會禁止proxy使用用戶名密碼這種鑒權方式,反之空就可以使用
-Djsse.enablesSNIExtension=false                    ## SNI支持,默認開啟,開啟會造成ssl握手警告
-XX:+HeapDumpOnOutOfMemoryError                     ## 表示當JVM發生OOM時,自動生成DUMP文件
-XX:HeapDumpPath=D:/data/log                        ## 表示生成DUMP文件的路徑,也可以指定文件名稱,如果不指定文件名,默認為:java_<pid>_<date>_<time>_heapDump.hprof。  
-XX:-OmitStackTraceInFastThrow                      ## 省略異常棧信息從而快速拋出,這個配置拋出這個異常非常快,不用額外分配內存,也不用爬棧,但是出問題看不到stack trace,不利於排查問題
-Dfile.encoding=UTF-8
-Duser.name=qhong

其他暫時沒用到的:

NewRatio:3                                         ## 新生代與年老代的比例。比如為3,則新生代占堆的1/4,年老代占3/4。
SurvivorRatio:8                                    ## 新生代中調整eden區與survivor區的比例,默認為8,即eden區為80%的大小,兩個survivor分別為10%的大小。 
PretenureSizeThreshold:10m                         ## 晉升年老代的對象大小。默認為0,比如設為10M,則超過10M的對象將不在eden區分配,而直接進入年老代。
MaxTenuringThreshold:15                            ## 晉升老年代的最大年齡。默認為15,比如設為10,則對象在10次普通GC后將會被放入年老代。
-XX:MaxTenuringThreshold=0                          ## 垃圾最大年齡,如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代,該參數只有在串行GC時才有效
-XX:+HeapDumpBeforeFullGC                           ## 當JVM 執行 FullGC 前執行 dump
-XX:+HeapDumpAfterFullGC                            ## 當JVM 執行 FullGC 后執行 dump
-XX:+HeapDumpOnCtrlBreak                            ## 交互式獲取dump。在控制台按下快捷鍵Ctrl + Break時,JVM就會轉存一下堆快照
-XX:+PrintGC                                        ## 輸出GC日志
-verbose:gc                                         ## 同PrintGC,輸出GC日志
-XX:+PrintGCDateStamps                              ## 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintFlagsInitial                              ## 顯示所有可設置參數及默認值 
-enablesystemassertions                             ## 激活系統類的斷言
-esa                                                ## 同上
-disablesystemassertions                            ## 關閉系統類的斷言
-dsa                                                ## 同上
-XX:+ScavengeBeforeFullGC                           ## FullGC前回收年輕代內存,默認開啟
-XX:+CMSScavengeBeforeRemark                        ## CMS remark前回收年輕代內存    
-XX:+CMSIncrementalMode                             ## 采用增量式的標記方式,減少標記時應用停頓時間
-XX:+CMSClassUnloadingEnabled                       ## 相對於並行收集器,CMS收集器默認不會對永久代進行垃圾回收。如果希望回收,就使用該標志,注意,即使沒有設置這個標志,一旦永久代耗盡空間也會嘗試進行垃圾回收,但是收集不會是並行的,而再一次進行Full GC
-XX:+CMSConcurrentMTEnabled                         ## 當該標志被啟用時,並發的CMS階段將以多線程執行(因此,多個GC線程會與所有的應用程序線程並行工作)。該標志已經默認開啟,如果順序執行更好,這取決於所使用的硬件,多線程執行可以通過-XX:-CMSConcurremntMTEnabled禁用。

Xms與Xmx配置相同的值,為了能夠在GC后不需要重新分隔計算堆區的大小而浪費資源。

CMS重要參數:

  • CMSInitiatingOccupancyFraction:觸發CMS收集器的內存比例。比如60%的意思就是說,當內存達到60%,就會開始進行CMS並發收集。
  • UseCMSCompactAtFullCollection:這個前面已經提過,用於在每一次CMS收集器清理垃圾后送一次內存整理。
  • CMSFullGCsBeforeCompaction:設置在幾次CMS垃圾收集后,觸發一次內存整理。

參考:

JVM系列四:生產環境參數實例及分析【生產環境實例增加中】

jvm的GC日志分析

JVM常用參數配置

深入了解JVM

JVM參數與實際環境中的優化配置實踐

JVM啟動參數大全

Java服務GC參數調優案例

關鍵業務系統的JVM參數推薦(2018仲夏版)

成為Java GC專家(5)—Java性能調優原則


免責聲明!

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



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