jvm性能瓶頸診斷分析
在java應用程序中,雖然不太容易出現內存溢出的問題,覺得jvm會不按期的進行垃圾回收,可是由於程序不合理的寫法,也會致使一些數據不能被收集,典型的狀況包括:
一、在HashMap中放置大量不用的數據,而沒有及時的清理。
二、在web應用中,開發人員喜歡在session中放置狀態數據,而沒有及時的清理。
三、在session中存放數據還好,由於session終究會有過時時間,可是若是在class的static變量中放置數據就不能被及時垃圾回收
permGen溢出:"java.lang.OutOfMemoryError PermGen space"
/bin/catalina.sh在CATALINA_base:%CATALIAN_base%
JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=64M -XX:MaxPermSize=128m
建議:將相同的第三方jar文件移植到tomcat/share/lib目錄下,這樣能夠減小JAR包重複佔用內存的目的
heap溢出:"java.lang.OutOfMemoryError java heap space"
提示:在JVM中若是98%de時間用於GC,且可用的Heap大小不足2%時,將拋出此異常信息,Heap最大不要超過可用的物理內存80%通常要將-Xms和-Xmx選項設置爲相同,而-Xmn爲1/4的-Xmx值
JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:PerSize=64 -XX:MaxPermSize=128m -XX:NewSize=8m -XX:MaxNewSize=16m
jvm內存泄露:垃圾回收時promotion failed
$JAVA_ARGS.=" -Dresin.home=$SERVER_ROOT -server -Xmx3000M -Xms3000M -Xmn600M -XX:PermSize=500M -XX:MaxPermSize=500M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log";
一、緣由Survivor空間不足 二、old區空間不足 full gc
帶CMS參數的都是和併發回收相關的,CMSInitatingOccupancyFraction,這個參數設置有很大技巧,基本知足(Xmx-Xmn)*(100-CMSInitatingOccupancyFraction)/100>=Xmn就不會出現promotion failed,
jvm:使用-XX:PermSize設置非堆內存初始化值,默認是物理內存的1/64;由XX:MaxpermSize設置最大非內存的大小,默認是物理內存的1/四、java