jvm的堆棧=年輕代+年老代,持久代是非堆棧,默認持久代64M;1.6版本以前通常運行在 client模式下!性能較差,實際生產須要注意,下面來張圖直觀點!html
CMS Old Gen:年老代 = 堆大小-年輕代 -Xms/-Xmx - -Xmn ;建議-Xmx ,-Xms設置成同樣大java
Par Eden Space + Par Survivor Space :年輕代 -Xmn 設置,影響實時處理性能linux
CMS Perm Gen: 持久代XX:PermSize,-XX:MaxPermSize設置,建議設置同樣大windows
Code Cache:代碼緩存去,編譯和保存本地代碼 -XX:InitialCodeCacheSize , -XX:ReservedCodeCacheSize 來設置,緩存
若是代碼緩存被佔滿,JVM會打印出一條警告消息,並切換到interpreted-only 模式:JIT編譯器被停用,字節碼將再也不會被編譯成機器碼,所以運行效率會下降1個數量級tomcat
-XX:+UseCodeCacheFlushing:當代碼緩存區滿後,jvm放棄繼續編譯本地代碼和方法,阻止熱部署引發的內存泄漏!多線程
jvm參數app
參數 | jdk1.6 | jdk1.7 | jdk1.8 | 說明 |
-server | - | - | jre\server\jvm.dll server VM模式,不然默認-client1.6,以後默認server VM | |
-Xms -Xmx | 堆棧大小,起始堆棧,最大可用堆棧 | |||
-Xmn | 堆棧年輕代大小,Sun官方推薦爲整個堆棧的3/8 | |||
-Xss | 每一個線程的大小,通常一個請求就是一個線程,這個值不宜多大,建議不超過1M | |||
-XX:+AggressiveOpts | 新技術優化 啓用,升級版本時,若是有的話 | |||
-XX:+UseBiasedLocking | 啓用一個優化了的線程鎖 | |||
-XX:PermSize=128M-XX:MaxPermSize=256M | - | JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64 | ||
-XX:+DisableExplicitGC | 顯示的調用」System.gc()」控制 | |||
-XX:+UseParNewGC | 對年輕代採用多線程並行回收 | |||
-XX:MaxTenuringThreshold | 0~15 | 設置垃圾最大年齡(次數) | ||
-XX:+CMSParallelRemarkEnabled | 在使用UseParNewGC 的狀況下, 儘可能減小 mark 的時間 | |||
-XX:+UseCMSCompactAtFullCollection | 在使用concurrent gc 的狀況下, 防止 memoryfragmention, 對live object 進行整理, 使 memory 碎片減小 | |||
-XX:LargePageSizeInBytes | 指定 Java heap的分頁頁面大小 | |||
-XX:+UseFastAccessorMethods | get,set 方法轉成本地代碼 | |||
-XX:+UseCMSInitiatingOccupancyOnly | 指示只有在 oldgeneration 在使用了初始化的比例後concurrent collector 啓動收集 | |||
-XX:CMSInitiatingOccupancyFraction=70 |
默認1.5:68,1.6/1.7:92;年老代開始回收閥值,需知足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn(1-1/(sradio+2)) 近似Xmn ,其實差蠻多的
即:Xmn *(200-CMSInitiatingOccupancyFraction)/(100-CMSInitiatingOccupancyFraction)<= Xmn
|
|||
-Djava.awt.headless=true | 禁用圖形化函數調用 |
調優設置less
一. 環境變量中增長 JAVA_OPTS而後把本身設置好的參數放進去,例如:jvm
32bit OS:
JAVA_OPTS=
-server
-Djava.awt.headless=true
-Xms1536M
-Xmx1536M
-Xmn256M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:PermSize=128M
-XX:MaxPermSize=256M
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=80
64bit OS:
JAVA_OPTS=
-server
-Djava.awt.headless=true
-Xms6g
-Xmx6g
-Xmn544M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=90
二. 在app啓動/初始化時加上啓動參數,如tomcat啓動時:
catalina.bat windows的:
set JAVA_OPTS=-server -Xms1536M ... ... 本身組合的參數
catalina.sh linux/unix的:
export JAVA_OPTS="-server -Xms1536M ... ...本身組合的參數"
windows server 安裝版本:
$(tomcate_base_dir)/bin/Tomcat7w.exe ,啓動後填寫參數
填寫在:java-->JavaOpions 中,若是有填寫 -Xms,-Xmx,-Xss最後的3個不要填寫,不然會被覆蓋,注意參數最後不能有空格,不然會失敗(tomcat啓動不了)
備註:
1. 在jre/bin/server/下Xusage.txt有參數說明及用法;
2. 32bit,64bit OS jvm能夠設置使用的堆棧也是不同的,通常32bit os理論可用的最大爲2048M,二實際其自身還佔使用一些,
像緩存空間,非堆棧等 通常默認不超過256M,加上自身調節的空間要達到 300+M才行,因此堆棧最大不會超過1700M,具體大小自行驗證,
64bit OS通常設置多少,均可以使用的!
參考:
http://www.cnblogs.com/jack204/archive/2012/07/02/2572934.html
http://blog.csdn.net/lifetragedy/article/details/7708724
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html