您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > TOMCAT JVM性能调优
TOMCATJVM性能调优Page1of33TOMCATJVM性能调优LIULUWriteAt2012-10-09TOMCATJVM性能调优Page2of33目录1JVM21.1JVM数据区域分布图21.2JVMHEAP区域分布图41.3常用HEAP区域调节参数51.4GC收集器选择71.5特有名词解释81.6GC调优工具91.7案例分析171.8JSP导出KILL3产生的线程信息201.9几篇博文供参考201.10触发FULLGC条件201.11统一生产ICMSJVM在用参数分析211.12新互动CLPSJVM在用参数241.13HEAPDUMP301.14应用按小时输出LOG321JVM1.1JVM数据区域分布图TOMCATJVM性能调优Page3of33TOMCATJVM性能调优Page4of331.2JVMHEAP区域分布图1.Young(年轻代)年轻代分三个区。一个Eden区,两个Survivor区。大部分对象首先在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor区也满了的时候,此时触发MinorGC,从第一Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。两个Survivor区在同一时间总有一个是空的。避免设置过小.当新生代设置过小时会导致:1-YGC次数更加频繁2-可能导致YGC对象直接进入旧生代,如果此时旧生代满了,会触发FGC2.Tenured(年老代),JDK1.5之后版本被称为OldGen。年老代用于存放年轻代MinorGC后还存活的对象。一般来说年老代存放的都是生命期较长的对象,当年老代再被占满的时候,会触发MajorGC。触发MajorGC时,会回收整个系统所有的空闲线程和空闲垃圾区块,对一个日PV百万级的应用,可能耗时过长,此时会造成系统不工作状态,要选择合适的GC收集器避免此现象的发生(JDK1.5ConMarkSwap或JDK1.6G1首选);但对ICMS来说,不需要考虑此因素,避免设置过大.当新生代设置过大时会导致,需要较长的收集时间,短时间内无法回收完毕,那么系统就要处停顿、或反应极慢需要将其值设置适中,保证在activeCount还未被耗尽且即将耗尽的时候,执行一次FullGC,回收垃圾spring线程,避免系统处于半死不活状态。TOMCATJVM性能调优Page5of33参考配置:JAVA_OPTS=-server-Xms2304M-Xmx2304M-Xmn1152M\-XX:PermSize=256M-XX:MaxPermSize=256M\-XX:+UseParallelOldGC-XX:ParallelGCThreads=3-XX:+ScavengeBeforeFullGC\-XX:+UseAdaptiveSizePolicy-XX:InitialTenuringThreshold=1\-XX:+UseFastAccessorMethods-XX:+UseBiasedLocking-Xnoclassgc\-Dcom.sun.management.jmxremote\-Djava.awt.headless=true\-verbose:gc-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintAdaptiveSizePolicy\-XX:+PrintHeapAtGC-XX:+PrintTenuringDistribution-Xloggc:/opt/onewave/icms/tomcat/logs/GC/gc.log_________________________________________________________3.PermGen(持久代)用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置,参数指定-Xnoclassgc不会回收Perm区域,也就是说Perm会一直增长不被回收,减少系统资源消耗但,通常情况下不手工指定(因为32位JDK可用内存资源有限)。1.3常用HEAP区域调节参数-Xms:最小堆大小,默认为物理内存的1/64,空余Heap内存小于40%时,JVM就会增大Heap直到-Xmx最大限制。-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余Heap内存大于70%时,JVM会减少Heap直到-Xms的最小限制。为避免,Heap频繁从Xms增加到Xmx或Xmx减少到Xms耗费系统资源,所以将Xmx设置的值与Xms相等(32位JDK,Xmx+MaxPermSize最大可使用2560Mb,TOMCATJVM性能调优Page6of33Xmx、Xms推荐使用2304M)-Xmn:新生代的内存空间大小,又称年轻代,其值为:1个eden+2个survivorspace。整个堆(Heap)大小(Xmx)=新生代大小(Xmn)+老生代大小新生代大小(Xmn)=1个eden+2个survivorspace-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,即一个Survivor区占整个年轻代的1/10,此值结合整个HEAP各区域空间大小,需要经过严格测试再进行合理分配(测试工具:jdk自带图形jconsole+命令行jstat、第三方图形probe,在后续介绍)。-XX:PermSize:设置永久代(permgen)初始值,默认值为物理内存的1/64。推荐使用256Mb-XX:MaxPermSize:设置持久代最大值,设置为与PermSize等值,避免频繁申请空间,耗费系统资源。(MaxPermSize推荐使用256M)-Xss:每个线程的堆栈大小,通常情况下不配置,让系统自行分配(1Mb)。-UseAdaptiveSizePolicy:JDK自动选择年轻代区大小和相应的Survivor区比例(也就是说不需要显式手工指定),此参数也是JDK默认隐式配置,为了配合PrintAdaptiveSizePolicy可以一起使用,通常显式指定。TLAB:TOMCATJVM性能调优Page7of33堆内的对象数据是各个线程所共享的,所以当在堆内创建新的对象时,就需要进行锁操作。锁操作是比较耗时,因此JVM为每个线在堆上分配了一块“自留地”——TLAB(全称是ThreadLocalAllocationBuffer),位于堆内存的新生代,也就是Eden区。每个线程在创建新的对象时,会首先尝试在自己的TLAB里进行分配,如果成功就返回,失败了再到共享的Eden区里去申请空间。在线程自己的TLAB区域创建对象失败一般有两个原因:一是对象太大,二是自己的TLAB区剩余空间不够。通常默认的TLAB区域大小是Eden区域的1%,当然也可以手工进行调整,对应的JVM参数是-XX:TLABWasteTargetPercent=11.4GC收集器选择JDK1.5默认选择的GC收集器是:UseParallelGC此收集器采用的是单CPU工作方式(单线程)对应的年轻代和年老代(持久代)GC方式对应如下:PSScavenge(年轻代)、PSMarkSweep(年老代(持久代))组合排列如下图所示:TOMCATJVM性能调优Page8of33通常情况下,我们选择增强版的UseParallelGC即UseParallelOldGC因为其年轻代和年老代GC方式都是并行,即可以多CPU同时工作。以上有这么多GC组合,我们该使用哪一种呢?参考1.6章节GC调优工具集1.5特有名词解释MinorGC、MajorGC又称FullGC可以用参数将GC信息写到LOG文件进行查看。-verbose:gc-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintAdaptiveSizePolicy-XX:+PrintHeapAtGC-Xloggc:/data/logs/GC/gc.logTOMCATJVM性能调优Page9of33MinorGC,Xmn空间被耗尽,即年轻代被耗尽,会触发MinorGC。MajorGC,Xmx-Xmn或MaxPermSize剩余空间不足,会触发MajorGC。1.6GC调优工具JDK自带jconsole图形工具(本地连接)修改启动脚本$TOMCAT_HOME/bin/catalina.sh,增加内容-Dcom.sun.management.jmxremote-Djava.awt.headless=true然后通过catalina.sh启动TOMCAT远程VNC连接服务器,执行$JAVA_HOME/bin/jconsole,显示如下图形选LocalProcessTOMCATJVM性能调优Page10of33TOMCATJVM性能调优Page11of33检测死锁工具:JDK自带jconsole图形工具(远程连接)修改启动脚本$TOMCAT_HOME/bin/catalina.sh,增加内容-Djava.awt.headless=true-Dcom.sun.management.jmxremote\-Dcom.sun.management.jmxremote.port=9999\-Dcom.sun.management.jmxremote.ssl=false\-Dcom.sun.management.jmxremote.authenticate=true\-Dcom.sun.management.jmxremote.access.file=/opt/onewave/icms/tomcat/bin/access\-Dcom.sun.management.jmxremote.password.file=/opt/onewave/icms/tomcat/bin/password\#/opt/onewave/icms/tomcat/bin/access内容:jvmreadonly#/opt/onewave/icms/tomcat/bin/password内容TOMCATJVM性能调优Page12of33jvmpasswd然后通过catalina.sh启动TOMCAT执行$JAVA_HOME/bin/jconsole,选remoteprocess第三方开源probe替换配置文件$TOMCAT_HOME/conf/tomcat-users.xmltomcat-users.xmlTOMCATJVM性能调优Page13of33且修改启动脚本$TOMCAT_HOME/bin/catalina.sh,增加内容-Dcom.sun.management.jmxremote-Djava.awt.headless=true将probe.war安装包扔到$TOMCAT_HOME/webapps下,不需要做任何更改Probe下载地址:@125.210.209.153/liulu/probe.war然后通过catalina.sh启动TOMCATWeb访问:用户名:admin密码:jkjfds!@#FDsfsTOMCATJVM性能调优Page14of33命令行工具(jmap)#查看HEAP各区域大小#$JAVA_HOME/bin/jmap-heap`pgrepjava`|more#查看各class占用的内存情况#$JAVA_HOME/bin/jmap-histo:live`pgre
本文标题:TOMCAT JVM性能调优
链接地址:https://www.777doc.com/doc-4238639 .html