簡介:
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垃圾收集后,觸發一次內存整理。