本期,边肖将为您带来一些关于JVM调优的策略。文章内容丰富,从专业角度进行分析和叙述。看完这篇文章,希望你能有所收获。
JVM的参数调优比较头疼,可能和应用有关,但是别人说的还行可能对自己没用。以下是我在JVM调优方面的实践经验,希望对读者有所帮助。环境是Linux AS 4,树脂2.1.17,JDK 6.0,2个CPU,4 G内存和dell2950服务器。
JVM调优
一:JVM调优之串行垃圾回收
也就是默认配置,完成100,000个请求需要153秒。JVM参数的配置如下:
$爪哇_ARGS。='-dresin . home=$ SERVER _ ROOT-SERVER-xms 2048m-xmx 2048m-xmn 512m-Xx 3360 permsize=256m-Xx 3360 max permsize=256m-Xx : max teningringthreshold=7-Xx 33 360 gctimeratio=19-Xnoclassgc-xlogg c 3360 log/GC . log-Xx 3: print gcdetails-Xx : printgc时间戳';一般这种配置在树脂启动后24小时内似乎没有大问题,网站可以正常访问。但是查看日志后发现,FullGC在接近24小时的时候执行越来越频繁,每3分钟就有一次FullGC,每次FullGC系统都会暂停6秒左右。作为一个网站,用户等待6秒的时间可能太长了,所以这种方式需要改进。MaxTenuringThreshold=7表示如果一个对象在救援空间中移动了7次,并且没有被回收,那么这个对象就被放入老一代,GCTimeRatio=19表示java可以花费5%的时间回收垃圾,1/(1 ^ 19)=1/20=5%。
二:JVM调优之并行回收
完成100,000个请求需要117秒,配置如下:
$爪哇_ARGS。='-dresin . home=$ SERVER _ ROOT-SERVER-xmx 2048m-xms 2048m-xmn 512m-Xx 3360 permsize=256m-Xx 3360 max permsize=256m-Xnoclassgc-xlogc 3360 log/GC . log-Xx : print gcdetails-Xx : print gctimestamps-Xx : UseParallelGC-Xx : parallecthreads=20-Xx 33:回收我并行尝试过的各种组合配置,好像没什么用。启动约3小时后树脂会停止,时间会超过10秒。也可能是参数设置不够好的原因。Maxgpausemillis代表GC***暂停时间。树脂刚启动,FullGC未执行时,系统正常。然而,一旦FullGC被执行,Maxgpausemillis就没用了。暂停时间可能超过20秒。我不在乎之后会发生什么。快速重启树脂,尝试其他回收策略。
三:JVM调优之并发回收
完成100,000个请求需要60秒,这几乎是并行回收的两倍,是默认回收策略性能的2.5倍。配置如下:
$爪哇_ARGS。='-dresin . home=$ SERVER _ ROOT-SERVER-xms 2048m-xmx 2048m-xmn 512m-Xx 3360 permsize=256m-Xx 3360 max permsize=256m-Xx : useconCmarksweepgc-Xx : maxteneringthreshold=7-Xx 3360 gctimeratio=19-Xnoclassgc-xlogc 3360 log/GC . log-Xx : print gcdetails虽然这种配置不会在10秒内断开,但重启约3小时后,系统每隔几分钟就会在5秒内断开。查看gc.log,发现在执行ParNewGC的时候有一个promotionfailed错误,所以转到FullGC,导致系统停止,而且会非常频繁,每几分钟一次,需要改进。UseCMSCompactAtFullCollection是一个在执行FullGC后整理和压缩内存以避免内存碎片的表。CMSFullGCsBeforeCompaction=N表示在执行了N次FullGC后,内存被压缩。
四:JVM调优之增量回收
/p>
完成10万request用时171秒,太慢了,配置如下:
$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xincgc";
似乎回收得也不太干净,而且也对性能有较大影响,不值得试。
五:JVM调优之并发回收的I-CMS模式
和增量回收差不多,完成10万request用时170秒。配置如下:
$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log -XX:+PrintGCDetails-XX:+PrintGCTimeStamps -XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10-XX:-TraceClassUnloading";
采用了sun推荐的参数,回收效果不好,照样有停顿,数小时之内就会频繁出现停顿,什么sun推荐的参数,照样不好使。
六:JVM调优之递增式低暂停收集器
又叫什么火车式回收,完成10万request用时153秒,配置如下:
$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+UseTrainGC";
该配置效果也不好,影响性能,所以没试。
七:相比之下,还是并发回收比较好,性能比较高,只要能解决ParNewGC(并行回收年轻代)时的promotionfailed错误就一切好办了,查了很多文章,发现引起promotionfailed错误的原因是CMS来不及回收(CMS默认在年老代占到90%左右才会执行),年老代又没有足够的空间供GC把一些活的对象从年轻代移到年老代,所以执行FullGC。CMSInitiatingOccupancyFraction=70表示年老代占到约70%时就开始执行CMS,这样就不会出现FullGC了。SoftRefLRUPolicyMSPerMB这个参数也是我认为比较有用的,官方解释是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttime
theywerereferenced.Thedefaultvalueisonesecondo
flifetimeperfreemegabyteintheheap,我觉得没必要等1秒,所以设置成0。配置如下
$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server-Xms2048M -Xmx2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M -XX:SurvivorRatio=8-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-XX:+DisableExplicitGC -XX:+UseParNewGC-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram -XX:+PrintGCDetails-XX:+PrintGCTimeStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -Xloggc:log/gc.log";
上面这个配置内存上升的很慢,24小时之内几乎没有停顿现象,最长的只停滞了0.8s,ParNewGC每30秒左右才执行一次,每次回收约0.2秒,看来问题应该暂时解决了。
参数不明白的可以上网查,本人认为比较重要的几个参数是:
-Xms-Xmx-XmnMaxTenuringThresholdGCTimeRatioUse
ConcMarkSweepGCCMSInitiatingOccupancyFractionSoftRefLRUPolicyMSPerMB
eclipse中配置JVM参数:-Xmx1024M-Xms1000M-server-XX:PermSize=64M-XX:MaxPermSize=128m
上述就是小编为大家分享的JVM调优的几种策略分别是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/44233.html