簡介:
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參數(shù)與實際環(huán)境中的優(yōu)化配置實踐
Java服務(wù)GC參數(shù)調(diào)優(yōu)案例