JVM参数调优技巧总结

开发 后端
本文通过实例向大家描述一下如何进行JVM参数调优,对于很多程序员来说这都是很头痛的问题,如果设置的不好,JVM不断执行FullGC,将导致整个系统变得很慢,网站停滞时间能达10秒以上。

你对JVM参数调优的概念了解多少,这里和大家分享一下其方法,如果设置的不好,JVM不断执行FullGC,将导致整个系统变得很慢,网站停滞时间能达10秒以上,这种情况如果没隔几分钟就来一次,自己都受不了。

JVM参数调优实例解析

关于JVM参数调优,对于很多程序员来说都是很头痛的问题,如果设置的不好,JVM不断执行FullGC,将导致整个系统变得很慢,网站停滞时间能达10秒以上,这种情况如果没隔几分钟就来一次,自己都受不了。

这种停滞在测试的时候看不出来,只有网站pv达到数十万/天的时候问题就暴露出来了,要想配置好JVM参数,需要对年轻代、年老代、救助空间和***代有一定了解,还要了解JVM内存管理逻辑,最终还要根据自己的应用来做调整。关于JVM参数上网一搜就能搜出一大把,也有很多提供实践的例子,我也按照各种例子测试过,最终还是会出现问题,经过几个月的实践改善,我就网站(要求无停滞时间)的jvm参数调优给出以下几条经验。

1:建议用64位操作系统,Linux下64位的JDK比32位JDK要慢一些,但是吃得内存更多,吞吐量更大。

2:XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。

3:调试的时候设置一些打印参数,如-XX:+PrintClassHistogram-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-Xloggc:log/gc.log,这样可以从gc.log里看出一些端倪出来。

4:系统停顿的时候可能是GC的问题也可能是程序的问题,多用Jmap和Jstack查看,或者killall-3Java,然后查看Java控制台日志,能看出很多问题。有一次,网站突然很慢,Jstack一看,原来是自己写的URLConnection连接太多没有释放,改一下程序就OK了。

5:仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的HashMap不应该无限制长,建议采用LRU算法的Map做缓存,LRUMap的***长度也要根据实际情况设定。

6:垃圾回收时PromotionFailed是个很头痛的问题,一般可能是两种原因产生,***个原因是救助空间不够,救助空间里的对象还不应该被移动到年老代,但年轻代又有很多对象需要放入救助空间;第二个原因是年老代没有足够的空间接纳来自年轻代的对象;这两种情况都会转向FullGC,网站停顿时间较长。***个原因我的最终解决办法是去掉救助空间,设置-XX:SurvivorRatio=65536-XX:MaxTenuringThreshold=0即可,第二个原因我的解决办法是设置CMSInitiatingOccupancyFraction为某个值(假设70),这样年老代空间到70%时就开始执行CMS,年老代有足够的空间接纳来自年轻代的对象。

7:不管怎样,***代还是会逐渐变满,所以隔三差五重起Java服务器是必要的,我每天都自动重起。

8:采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿,我的最终配置如下(系统8G内存),每天几百万PV一点问题都没有,网站没有停顿,2009年网站没有因为内存问题down过机。

  1. $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  
  2. -Xms6000M-Xmx6000M-Xmn500M-XX:PermSize=500M  
  3.  
  4. -XX:MaxPermSize=500M-XX:SurvivorRatio=65536
  5. -XX:MaxTenuringThreshold=0-Xnoclassgc  
  6.  
  7. -XX:+DisableExplicitGC-XX:+UseParNewGC-XX:+UseConcMarkSweepGC  
  8.  
  9. -XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction=0-XX:
  10. +CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled  
  11.  
  12. -XX:CMSInitiatingOccupancyFraction=90
  13. -XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram  
  14.  
  15. -XX:+PrintGCDetails-XX:+PrintGCTimeStamps
  16. -XX:+PrintHeapAtGC-Xloggc:log/gc.log";  

说明一下,-XX:SurvivorRatio=65536-XX:MaxTenuringThreshold=0就是去掉了救助空间:

◆-Xnoclassgc禁用类垃圾回收,性能会高一点;
◆-XX:+DisableExplicitGC禁止System.gc(),免得程序员误调用gc方法影响性能;
◆-XX:+UseParNewGC,对年轻代采用多线程并行回收,这样收得快;带CMS参数的都是和并发回收相关的。

CMSInitiatingOccupancyFraction

这个JVM参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotionfailed。在我的应用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还剩10%的空间是5500*10%=550兆,所以即使Xmn(也就是年轻代共500兆)里所有对象都搬到年老代里,550兆的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的PromotionFailed;

SoftRefLRUPolicyMSPerMB

这个参数我认为可能有点用,官方解释是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttimetheywerereferenced.

Thedefaultvalueisonesecondoflifetimeperfreemegabyteintheheap,我觉得没必要等1秒;

网上其他介绍JVM参数的也比较多,估计其中大部分是没有遇到PromotionFailed,或者访问量太小没有机会遇到,(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn这个公式绝对是原创,真遇到PromotionFailed了,还得这么处理。
 

【编辑推荐】

  1. JVM参数调优八大技巧
  2. 解决JVM***内存设置问题
  3. 高手教大家如何配置JVM参数
  4. 详解Tomcat配置JVM参数步骤
  5. 深入学习JVM内存设置原理和调优

 

 

责任编辑:佚名 来源: xker.com
相关推荐

2012-01-10 14:35:08

JavaJVM

2010-09-17 17:02:24

JVM参数

2010-09-26 09:08:17

JVM调优

2012-01-10 15:13:56

JavaJVM

2021-03-17 11:35:11

JVM代码Java

2010-03-04 10:56:52

JVM参数

2023-11-10 11:23:20

JVM内存

2010-09-25 15:52:27

JVM内存JVM

2010-09-26 13:48:51

JVM调优

2019-12-20 14:21:26

JVM调优垃圾回收

2012-01-10 14:18:40

JavaJVM

2012-01-09 16:02:19

JavaJVM

2012-01-09 16:53:36

JavaJVM

2022-11-30 08:17:41

JVM调优技巧

2020-12-30 15:06:39

开发技能代码

2017-07-21 08:55:13

TomcatJVM容器

2023-11-11 19:07:23

JVMJava

2012-01-09 17:06:16

JavaJVM

2012-01-10 11:19:35

JavaJVM

2021-09-06 11:02:17

JVM架构调优
点赞
收藏

51CTO技术栈公众号