LOGOTomcat的JVM优化设置2020/1/101LOGO目录2020/1/102•GC介绍1•分代介绍2•内存回收算法3•测试结果4•结论5LOGO2020/1/103GC介绍LOGO2020/1/104GCGC是一个自动管理内存的程序。主要职责是分配内存,保证被引用的对象始终在内存,把不被应用的对象从内存中释放GC会自动计算对象被引用的情况,只要对象不再被引用,相应的内存就会被回收,另外,GC非常重要的一点就避免内存碎片,道理跟windows的磁盘整理一样,把使用中各个内存块整合起来,这样才能保证有足够的空间来存储大对象。LOGO2020/1/105GC类型ScavengeGC一般情况下,当新对象生成,并且在Eden申请空间失败时,就好触发ScavengeGC,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。FullGC对整个堆进行整理,包括Young、Tenured和Perm。FullGC比ScavengeGC要慢,因此应该尽可能减少FullGC。有如下原因可能导致FullGC:Tenured被写满Perm域被写满System.gc()被显示调用上一次GC之后Heap的各域分配策略动态变化LOGO2020/1/106GC的性能评判标准吞吐量(Throughput)—全部时间中不用于GC的比例。(重点)暂停时间—GC过程中应用程序执行暂停的时间。(重点)GC的开销—全部时间中用于GC的比例。GC的频率—通过跟应用程序的执行比较来得到GC的执行频率。支持GC运行所需使用的内存大小—例如heap的大小。GC的及时性(Promptness)—一个对象从被废弃到内存被回收之间的时间差LOGO2020/1/107分代介绍LOGO2020/1/108分代(Generations)分代根据对象的生命周期长短,把堆分为3个代:Young(年轻代、新生代)Old(年老代、老生代)Permanent(永生代)优点:根据不同代的特点采用不同的收集算法,扬长避短LOGO2020/1/109-Xms1280m-Xmx1280m堆大小-XX:PermSize=128m-XX:MaxPermSize=128m永生代大小-Xss128K单线程栈的大小-XX:MaxTenuringThreshold=2新生代对象经过2次进入老年代堆内存分布图LOGOYOUNGYoung(Nursery),年轻代。研究表明大部分对象都是朝生暮死,随生随灭的。因此所有收集器都为年轻代选择了复制算法。Young里面又分为3个区域,一个Eden,所有新建对象都会存在于该区,两个Survivor区,用来实施复制算法。每次复制就是将Eden和第一块Survior的活对象复制到第2块,然后清空Eden与第一块Survior。由于新生代的空间通常都比较小而且可能存在大量不再被引用的对象,所以针对新生代的GC执行频率高、速度快。10LOGOOld(Tenured),年老代Old(Tenured),年老代。年轻代的对象如果能够挺过数次收集,就会进入年老代。年老代使用标记整理算法。因为年老代的对象都没那么容易死的,采用复制算法就要反复的复制对象,很不合算,只好采用标记清理算法,但标记清理算法其实也不轻松,每次都要遍历区域内所有对象Perm(permanent),永生代。例如类和方法对象以及它们的描述对象。11LOGO分代回收过程•单击此处添加文本•单击此处添加文本•单击此处添加文本Eden到Survior•单击此处添加文本•单击此处添加文本•单击此处添加文本整理•单击此处添加文本•单击此处添加文本•单击此处添加文本放入年老代2020/1/1012LOGO2020/1/1013内存回收算法LOGO只使用一个cpu,并且回收时,应用程序会暂停-XX:+UseSerialGC142020/1/10串行收集器LOGO-XX:+UseParallelGC-XX:+UseParallelOldGC(JDK6.0支持对年老代并行收集)-XX:ParallelGCThreads=N-XX:MaxGCPauseMillis=N-XX:GCTimeRatio=N152020/1/10并行收集器LOGO-XX:+UseConcMarkSweepGC-XX:+UseParNewGC-XX:+CMSParallelRemarkEnabled-XX:CMSInitiatingOccupancyFraction=60-XX:CMSFullGCsBeforeCompaction=5-XX:+UseCMSCompactAtFullCollection162020/1/10并发收集器LOGO吞吐量优先–Xmx1280m–Xms1280m–Xmn480m–Xss256k–XX:PermSize=64m–XX:MaxPermSize=128m–XX:+UseParallelGC–XX:+UseParallelOldGC–XX:ParallelGCThreads=8–XX:MaxGCPauseMillis=100172020/1/10LOGO短暂停优先-Xmx1280m-Xms1280m-Xmn480m-Xss256k-XX:PermSize=64m-XX:MaxPermSize=128m-XX:+UseConcMarkSweepGC-XX:ParallelGCThreads=8-XX:CMSFullGCsBeforeCompaction=0-XX:+UseCMSCompactAtFullCollection-XX:SurvivorRatio=8-XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19-Xnoclassgc-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:-CMSParallelRemarkEnabled-XX:CMSInitiatingOccupancyFraction=70-XX:SoftRefLRUPolicyMSPerMB=0182020/1/10LOGO其他参数-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+DisableExplicitGC-Xloggc:filename2020/1/10LOGO2020/1/1020测试结果LOGO测试环境软件环境:jdk1.6.0_26+tomcat-7.0.35+Linuxversion2.6.32-279.14.1.el6.x86_64测试压力:100并发,循环执行500000次模拟应用:1K字符串数组转换为List212020/1/10LOGO默认参数测试结果:出现FullGC,应用最大停顿3.96秒2020/1/1022点击此处添加脚注信息LOGO并行收集测试结果:出现FullGC,应用最大停顿5.38秒2020/1/1023点击此处添加脚注信息LOGO并发收集测试结果:未出现FullGC,应用最大停顿0.37秒2020/1/1024点击此处添加脚注信息LOGO2020/1/1025结论LOGO最终推荐参数配置-Xmx1280m-Xms1280m-Xmn480m-Xss256k-XX:PermSize=64m-XX:MaxPermSize=128m-XX:+UseConcMarkSweepGC-XX:ParallelGCThreads=8-XX:CMSFullGCsBeforeCompaction=0-XX:+UseCMSCompactAtFullCollection-XX:SurvivorRatio=8-XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19-Xnoclassgc-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:-CMSParallelRemarkEnabled-XX:CMSInitiatingOccupancyFraction=70-XX:SoftRefLRUPolicyMSPerMB=0262020/1/10