jvm诊断与优化(8)

本例环境说明:
OS: window 7; 64bit; RAM:4GB; 双核3.00GH
jdk: version:1.7.0_75-b13; 64bit; jvm: HotSpot
tomcat:7.0.59

查看tomcat运行时的jvm参数----------------------------------------------------------------

打开tomcat的安装目录/bin/catalina.bat文件,找到如下信息

#   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位架构下,长度                                             会翻倍(更宽的寻址)。 这个参数压缩指针,起到节约内存占用的新参数。 

在中部会显示如下信息:

[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的不同

最后的输出

信息: Server startup in 10670 ms
启动这个项目用了10.67s

jvm适当的调优--------------------------------------------------------------

jvm调优主要是针对GC,主要使GC总的工作时间变少。这包括STW时间,标记时间,及GC与应用程序的并发时间。

1.将参数改成如下:

set CATALINA_OPTS=-XX:+PrintGCDetails -Xms1041361920 -Xmx1041361920



结果:信息: Server startup in 9582 ms


2.换个GC

set CATALINA_OPTS=-XX:+PrintGCDetails -Xms1041361920 -Xmx1041361920 -XX:+UseSerialGC



结果:信息: Server startup in 9997 ms


3.使用G1

set CATALINA_OPTS=-XX:+PrintGC -Xms1041361920 -Xmx1041361920 -XX:+UseG1GC



结果:信息: Server startup in 10560 ms


以上结果看到对于双核的cup使用并发的G1与CMS并没有什么优势,而jdk7默认年轻代用ParallelGC,老年代采用ParallelOldGC

相关文章
相关标签/搜索