老司機常用JVM 啟動參數解析

截取了生產服務器上的JVM啟動參數,都是前人踩過無數坑總結出的精華。這里逐個介紹下

-server ①
-Xms512m ②
-Xmx1024m ③
-XX:PermSize=256m ④
-XX:MaxPermSize=512m ⑤

-XX:SurvivorRatio=6 ⑥
-XX:+DisableExplicitGC ⑦
-XX:MaxTenuringThreshold=5 ⑧
-XX:+UseConcMarkSweepGC ⑨
-XX:+UseParNewGC ⑩
-XX:+UseCMSCompactAtFullCollection ?
-XX:CMSFullGCsBeforeCompaction=5 ?
-XX:+UseCMSInitiatingOccupancyOnly ?
-XX:CMSInitiatingOccupancyFraction=70 ?
-XX:+PrintGC ?
-XX:+PrintGCDetails ?
-XX:+PrintGCDateStamps ?
-Xloggc:/tt/ttadmin/servers/axe_52500/logs/gc.log ?

-XX:+HeapDumpOnOutOfMemoryError ?
-XX:HeapDumpPath=/tt/ttadmin/servers/axe_52500/logs ?

-Dorg.apache.catalina.SESSION_COOKIE_NAME=axe_52500SESSIONID ?
-Djava.endorsed.dirs=/tt/ttadmin/webserver/tomcat/endorsed ?
-Dcatalina.base=/tt/ttadmin/servers/axe_52500 ?
-Dcatalina.home=/tt/ttadmin/webserver/tomcat ?

-Dfile.encoding=UTF-8 ?
-Doracle.jdbc.V8Compatible=true ?
-Djava.security.egd=file:/dev/./urandom ?
-Dsun.net.inetaddr.ttl=3 ?
-Djava.net.preferIPv4Stack=true ?

-Dcom.sun.management.jmxremote ?
-Dcom.sun.management.jmxremote.authenticate=false ?
-Dcom.sun.management.jmxremote.ssl=false ?
-Dcom.sun.management.jmxremote.port=52509 ?
-Djava.rmi.server.hostname=192.168.10.70 ?

org.apache.catalina.startup.Bootstrap
-config /tt/ttadmin/servers/axe_52500/conf/server.xml

======================================================

JVM實現:JDK6·JDK7:Oracle官方Hotspot

  • JRockit 從JDK7開始并入 Hotspot
  • OpenJDKHotspot 的開源子集,Hotspot 多了少量商業(yè)功能(沒怎么用到過)
  • 從JDK8開始,PermGen (永久代)被 Metaspace (元空間) 替代


① -server 指定以服務模式啟動

啟動模式比較 client server
編譯速度 快(10?%)
運行速度
默認資源占用
適用場景 GUI/腳本執(zhí)行 服務器
32位支持
64位支持 ×

②-Xms512m 設置 堆內存 最小值/初始值

③-Xmx1024m 設置 堆內存 最大值

④-XX:PermSize=256m 設置 永久代 最小值/初始值

⑤-XX:MaxPermSize=512m 設置 永久代 最大值

  • 如果內存波動比較厲害,建議Xms設置同Xmx,JVM擴大內存會拖慢性能。
  • 永久代一般啟動后是比較穩(wěn)定的, 大量使用動態(tài)代理會占用更多永久代內存
  • JDK8開始方法區(qū)由元空間替代,相應參數為-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize


⑥-XX:SurvivorRatio=6 設置老年代占堆內存的比例,默認老年代占8,新生代占2。增加新生代占比在較多即生即滅對象時(例如ETL任務),可以減少新生代的GC頻率

⑦-XX:+DisableExplicitGC 禁止代碼中的System.gc()

⑧-XX:MaxTenuringThreshold=5 設置晉升老年代的最大minor GC次數,默認值=最大值=15 實際晉升條件比較復雜,減小該值只能說一定程度上提高新生代的利用率,可能看不出效果

⑨-XX:+UseConcMarkSweepGC 使用CMS收集器收集老年代,特點是停頓短,停頓少。吞吐量相對低。適合短連接事務型系統(tǒng)

⑩-XX:+UseParNewGC 和上一條配合,年輕代使用并行GC

?-XX:+UseCMSCompactAtFullCollection 開啟CMS壓縮,解決碎片化問題。壓縮會增加停頓,但是會減少FullGC頻率。

?-XX:CMSFullGCsBeforeCompaction=5 CMS每5次Full GC進行一次壓縮

?-XX:+UseCMSInitiatingOccupancyOnly CMS在一次GC后默認會自己預測計算下次啟動GC的占比,據說有時候會導致頻繁GC,所以開啟后固定為下面的初始比例

?-XX:CMSInitiatingOccupancyFraction=70 CMS初始觸發(fā)GC的占用比例

?-XX:+PrintGC 輸出GC日志

?-XX:+PrintGCDetails 輸出GC的詳細日志

?-XX:+PrintGCDateStamps 輸出GC的時間戳

?-Xloggc:/tt/ttadmin/servers/axe_52500/logs/gc.log GC文件的輸出路徑


?-XX:+HeapDumpOnOutOfMemoryError 內存溢出時保存當時的內存快照

?-XX:HeapDumpPath=/tt/ttadmin/servers/axe_52500/logs 內存溢出時保存當時的內存快照


?-Dorg.apache.catalina.SESSION_COOKIE_NAME=axe_52500SESSIONID 設置tomcat session的名字,解決同一域名下多應用session沖突的問題

?-Djava.endorsed.dirs=/tt/ttadmin/webserver/tomcat/endorsed 使用定制的實現替換JDK標準實現,主要是替換xml解析器

?-Dcatalina.base=/tt/ttadmin/servers/axe_52500 指定tomcat war包路徑

?-Dcatalina.home=/tt/ttadmin/webserver/tomcat 指定tomcat啟動命令路徑

?-Dfile.encoding=UTF-8 修改JVM默認字符集,涉及到文件IO,class文件內的中文問題等。默認為系統(tǒng)字符編碼,中文系統(tǒng)Windows常見為GBK


?-Doracle.jdbc.V8Compatible=true 修復oracle10g驅動對日期的處理流失時間問題

?-Djava.security.egd=file:/dev/./urandom 默認的隨機數生成會阻塞,該配置改為非阻塞。用UUID的同學也會用到

?-Dsun.net.inetaddr.ttl=3 設置JVM緩存NDS時間,默認是永遠有效,必須重啟

?-Djava.net.preferIPv4Stack=true 優(yōu)先使用IPv4地址


?-Dcom.sun.management.jmxremote 開始JMX

?-Dcom.sun.management.jmxremote.authenticate=false 關閉JMX認證

?-Dcom.sun.management.jmxremote.ssl=false 關閉JMX認證

?-Dcom.sun.management.jmxremote.port=52509 設置JMX端口

?-Djava.rmi.server.hostname=192.168.10.70 設置RMI主機名,避免127.0.0.1遠程不認識

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容