CMS GC啟動參數(shù)優(yōu)化配置

簡介:

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

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

設(shè)置:

1.設(shè)置環(huán)境變量JAVA_OPTS

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

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

JAVA_OPTS:用于當(dāng) Java 運行時選項“start”、“stop”或“run”命令執(zhí)行。

CATALINA_OPTS:用于當(dāng) Java 運行時選項“start”或“run”命令執(zhí)行。

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

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

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

參數(shù):

我在本地配置的:

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

其他暫時沒用到的:

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

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

CMS重要參數(shù):

  • CMSInitiatingOccupancyFraction:觸發(fā)CMS收集器的內(nèi)存比例。比如60%的意思就是說,當(dāng)內(nèi)存達(dá)到60%,就會開始進(jìn)行CMS并發(fā)收集。
  • UseCMSCompactAtFullCollection:這個前面已經(jīng)提過,用于在每一次CMS收集器清理垃圾后送一次內(nèi)存整理。
  • CMSFullGCsBeforeCompaction:設(shè)置在幾次CMS垃圾收集后,觸發(fā)一次內(nèi)存整理。

參考:

JVM系列四:生產(chǎn)環(huán)境參數(shù)實例及分析【生產(chǎn)環(huán)境實例增加中】

jvm的GC日志分析

JVM常用參數(shù)配置

深入了解JVM

JVM參數(shù)與實際環(huán)境中的優(yōu)化配置實踐

JVM啟動參數(shù)大全

Java服務(wù)GC參數(shù)調(diào)優(yōu)案例

關(guān)鍵業(yè)務(wù)系統(tǒng)的JVM參數(shù)推薦(2018仲夏版)

成為Java GC專家(5)—Java性能調(diào)優(yōu)原則

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容