本例環境說明:
OS: window 7; 64bit; RAM:4GB; 雙核3.00GH
jdk: version:1.7.0_75-b13; 64bit; jvm: HotSpot
tomcat:7.0.59
查看tomcat運行時的jvm參數---------------------------------------------------------------- shell
打開tomcat的安裝目錄/bin/catalina.bat文件,找到以下信息 tomcat
# CATALINA_OPTS (Optional) Java runtime options used when the "start", # "run" or "debug" command is executed. # Include here and not in JAVA_OPTS all options, that should # only be used by Tomcat itself, not by the stop process, # the version command etc. # Examples are heap size, GC logging, JMX ports etc. ...... # JAVA_OPTS (Optional) Java runtime options used when any command # is executed. # Include here and not in CATALINA_OPTS all options, that # should be used by Tomcat and also by the stop process, # the version command etc. # Most options should go into CATALINA_OPTS.
這兩個參數均可以控制Tomcate啓動時的虛擬機參數,CATALINA_OPTS 用於控制Tomcat自己的虛擬機參數,這個配置參數不會被Tomcat其餘進程如shutdown.sh使用。而JAVA_OPTS變量使用範圍更廣,除了Tomcat其餘相關進行也會使用JAVA_OPTS 配置。大部分使用CATALINA_OPTS 。 架構
添加以下參數(能夠修改# CATALINA_OPTS 或 緊接着註解添加該設置):
併發
set CATALINA_OPTS=-XX:+PrintGCDetails -XX:+PrintCommandLineFlags運行startup.bat文件,在tomcat控制檯的最上面會看到以下信息
-XX:InitialHeapSize=65085120 -XX:MaxHeapSize=1041361920 -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
輸出信息說明:
InitialHeapSize : 初始化堆大小爲65085120=62M
MaxHeapSize : 最大的堆的大小爲1041361920=993M
UseParallelGC : 新生代使用ParallelGC回收器,老年代使用串行回收器(但從輸出日誌看不是串行回收器,應該是ParallelOldGC)
UseCompressedOops : 一般64位JVM消耗的內存會比32位的大1.5倍,由於對象指針在64位架構下,長度 會翻倍(更寬的尋址)。 這個參數壓縮指針,起到節約內存佔用的新參數。
jvm
在中部會顯示以下信息: spa
[GC [PSYoungGen: 16384K->2552K(18944K)] 16384K->4168K(60928K), 0.0150727 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] [GC [PSYoungGen: 18936K->2546K(35328K)] 20552K->6842K(77312K), 0.0110277 secs] [Times: user=0.02 sys=0.02, real=0.01 secs] [GC [PSYoungGen: 35314K->2538K(35328K)] 39610K->10408K(77312K), 0.0175923 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] [GC [PSYoungGen: 35306K->2531K(68096K)] 43176K->15661K(110080K), 0.0181178 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] [GC [PSYoungGen: 68067K->2553K(68096K)] 81197K->26591K(110080K), 0.0161480 secs] [Times: user=0.00 sys=0.00, real=0.02 secs] [GC [PSYoungGen: 68089K->13308K(141312K)] 92127K->38656K(183296K), 0.0527752 secs] [Times: user=0.03 sys=0.00, real=0.05 secs] [GC [PSYoungGen: 141308K->16375K(144384K)] 166656K->50515K(186368K), 0.0289857 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] [Full GC [PSYoungGen: 16375K->3389K(144384K)] [ParOldGen: 34139K->41725K(76288K)] 50515K->45115K(220672K) [PSPermGen: 12863K->12860K(26112K)], 0.1176968 secs] [Times: user=0.16 sys=0.00, real=0.12 secs] [GC [PSYoungGen: 131389K->23533K(230400K)] 173115K->68253K(306688K), 0.0311505 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] [GC [PSYoungGen: 230381K->29180K(273920K)] 275101K->78067K(350208K), 0.0338689 secs] [Times: user=0.02 sys=0.02, real=0.03 secs] [GC [PSYoungGen: 273916K->24400K(301568K)] 322803K->79293K(377856K), 0.0812228 secs] [Times: user=0.16 sys=0.00, real=0.09 secs]
輸出說明:
這個是項目啓動時全部垃圾回收器的工做日誌的彙總,能夠看到GC工做了11次,其中年輕代工做了10次,老年代工做了1次。
如第一行的輸出:年輕代的大小從16384KB 回收後變成2552KB,總的年輕代可用大小爲18944K。整個堆的大小從16384KB 回收後變成4168KB。整個堆的可用大小爲60928KB。
第二行中年輕代的大小增加了,整個堆的大小也跟着變長。
到了第8行進行了一次Full GC ,老年代,年輕代,與Perm區都進行了回收。注意:從輸出日誌來看老年代並非使用串行收回器,應該是ParallelOldGC。這應該是jdk6與jdk7的不一樣
debug
最後的輸出
指針
信息: Server startup in 10670 ms啓動這個項目用了10.67s
jvm適當的調優-------------------------------------------------------------- 日誌
jvm調優主要是針對GC,主要使GC總的工做時間變少。這包括STW時間,標記時間,及GC與應用程序的併發時間。 code
1.將參數改爲以下:
set CATALINA_OPTS=-XX:+PrintGCDetails -Xms1041361920 -Xmx1041361920
2.換個GC
set CATALINA_OPTS=-XX:+PrintGCDetails -Xms1041361920 -Xmx1041361920 -XX:+UseSerialGC
3.使用G1
set CATALINA_OPTS=-XX:+PrintGC -Xms1041361920 -Xmx1041361920 -XX:+UseG1GC
以上結果看到對於雙核的cup使用併發的G1與CMS並無什麼優點,而jdk7默認年輕代採用ParallelGC,老年代採用ParallelOldGC