1.調整堆中新生代和倖存代大小,避免由於倖存代不足而讓Minor GC後的對象進入老年代。每次Minor GC都有對象進入老年代會形成數次MinorGC後FullGC.java
2.減小永久區浪費,JVM進程啓動完畢後,永久區變化不大了,這時能夠參看Perm是否有剩餘空間,節省Perm區的空間分給新生代用。算法
縮短單次MinorGC所用時間:選擇合理的GC算法,並進行GC算法參數調整。好比 低交互性可以使用Parallel Scavenge(這種不會盡量縮短GC時間)apache
(1) 查看gc統計結果tomcat
[hotspot@bogon ~]$ jstat -gcutil 3553 | column -t S0 S1 E O P YGC YGCT FGC FGCT GCT 10.28 0.00 90.07 91.12 51.75 838 60.922 1 1.728 62.650
從結果看出,雖然經歷了838次MinorGC,但僅發生了1次 FullGC,成功避免了FullGCapp
(2)查看JVM參數eclipse
[hotspot@bogon ~]$ jinfo -flags 3553 Attaching to process ID 3553, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.5-b02 -Djava.util.logging.config.file=/home/hotspot/tomcat7_8082/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms500m -Xmx800m -XX:PermSize=256M -XX:MaxPermSize=300M \ -Djava.endorsed.dirs=/home/hotspot/tomcat7_8082/endorsed -Dcatalina.base=/home/hotspot/tomcat7_8082 -Dcatalina.home=/home/hotspot/tomcat7_8082 -Djava.io.tmpdir=/home/hotspot/tomcat7_8082/temp
(3)成功tomcat調優案例ui
[hotspot@bogon ~]$ jinfo -flags 25493 Attaching to process ID 25493, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.5-b02 -Djava.util.logging.config.file=/home/hotspot/tomcat7b/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
-XX:+UseG1GC -XX:+UnlockCommercialFeatures -Xms800m -Xmx800m -XX:MaxTenuringThreshold=12 -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:SurvivorRatio=6 -XX:PermSize=250M -XX:MaxPermSize=400M \
-Djava.rmi.server.hostname=172.16.11.52 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9110 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false \
-Djava.endorsed.dirs=/home/hotspot/tomcat7b/endorsed -Dcatalina.base=/home/hotspot/tomcat7b -Dcatalina.home=/home/hotspot/tomcat7b -Djava.io.tmpdir=/home/hotspot/tomcat7b/temp [hotspot@bogon ~]$ jstat -gcutil 25493 5s 1 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 100.00 4.96 54.33 69.55 1166 247.260 0 0.000 247.260
從jstat的結果看出,FGC沒有發生過。spa
jdk 1.7.0_17 | win10 64bit | cpu 3.0 | ram 8g | hd 1t code
-startup plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20150204-1316 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile -showsplash org.eclipse.platform --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.6 #### 該行如下爲調優參數 #### -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:+DisableExplicitGC -Xmn550m -XX:SurvivorRatio=6 -Xms1024m -Xmx1024m -XX:MaxPermSize=400m -XX:PermSize=300M -XX:MaxTenuringThreshold=12 -Declipse.p2.max.threads=20
-XX:+DisableExplicitGC : 禁止在程序在使用System.gc() 這個方法會引起FullGC,爲了讓關閉後的窗體再也不佔用堆內存, eclipse程序中自動調用了System.gc()orm
-XX:MaxTenuringThreshold=12:讓須要進入老年代的對象儘快進入
調優結果:startup:6s loadup:12s openPomXml:3s