CMS GC啓動參數優化配置

簡介:

java啓動參數共分爲三類;
其一是標準參數(-),全部的JVM實現都必須實現這些參數的功能,並且向後兼容;
其二是非標準參數(-X),默認jvm實現這些參數的功能,可是並不保證全部jvm實現都知足,且不保證向後兼容;
其三是非Stable參數(-XX),此類參數各個jvm實現會有所不一樣,未來可能會隨時取消,須要慎重使用;html

-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_OPTSjava

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

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

JAVA_OPTS:用於當 Java 運行時選項「start」、「stop」或「run」命令執行。緩存

CATALINA_OPTS:用於當 Java 運行時選項「start」或「run」命令執行。tomcat

爲何有兩個不一樣的變量?它們之間都有什麼區別呢?服務器

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

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

參數:

我在本地配置的:jvm

-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性能調優原則

相關文章
相關標籤/搜索