截取了生產服務器上的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
-
OpenJDK 是 Hotspot 的開源子集,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ā)布平臺,僅提供信息存儲服務。