JVM参数调优是一个很头痛的问题,可能和应用有关系,别人说可以的对自己不一定管用。下面是本人一些JVM调优的实践经验,希望对读者能有帮助,环境LinuxAS4,resin2.1.17,JDK6.0,2CPU,4G内存,dell2950服务器。
    
    JVM调优
    
    一:JVM调优之串行垃圾回收
    
    也就是默认配置,完成10万request用时153秒。JVM参数配置如下:
    
    $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”;
    
    这种配置一般在resin启动24小时内似乎没有大问题,网站可以正常访问,但查看日志发现,在接近24小时时,FullGC执行越来越频繁,大约每隔3分钟就有一次FullGC,每次FullGC系统会停顿6秒左右,作为一个网站来说,用户等待6秒恐怕太长了,所以这种方式有待改善。MaxTenuringThreshold=7表示一个对象如果在救助空间移动7次还没有被回收就放入年老代,GCTimeRatio=19表示java可以用5%的时间来做垃圾回收,1/(1+19)=1/20=5%.
    
    二:JVM调优之并行回收
    
    完成10万request用时117秒,配置如下:
    
    $JAVA_ARGS.=“-Dresin.home=$SERVER_ROOT-server-Xmx2048M
    
    -Xms2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M
    
    -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails
    
    -XX:+PrintGCTimeStamps-XX:+UseParallelGC-XX:ParallelGCThreads=20
    
    -XX:+UseParallelOldGC-XX:MaxGCPauseMillis=500
    
    -XX:+UseAdaptiveSizePolicy-XX:MaxTenuringThreshold=7
    
    -XX:GCTimeRatio=19”;
    
    并行回收我尝试过多种组合配置,似乎都没什么用,resin启动3小时左右就会停顿,时间超过10秒。也有可能是参数设置不够好的原因,MaxGCPauseMillis表示GC最大停顿时间,在resin刚启动还没有执行FullGC时系统是正常的,但一旦执行FullGC,MaxGCPauseMillis根本没有用,停顿时间可能超过20秒,之后会发生什么我也不再关心了,赶紧重启resin,尝试其他回收策略。
    
    三:JVM调优之并发回收
    
    完成10万request用时60秒,比并行回收差不多快一倍,是默认回收策略性能的2.5倍,配置如下:
    
    $JAVA_ARGS.=“-Dresin.home=$SERVER_ROOT-server
    
    -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M
    
    -XX:MaxPermSize=256M-XX:+UseConcMarkSweepGC
    
    -XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19
    
    -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails
    
    -XX:+PrintGCTimeStamps-XX:+UseCMSCompactAtFullCollection
    
    -XX:CMSFullGCsBeforeCompaction=0”;
    
    这个配置虽然不会出现10秒连不上的情况,但系统重启3个小时左右,每隔几分钟就会有5秒连不上的情况,查看gc.log,发现在执行ParNewGC时有个promotionfailed错误,从而转向执行FullGC,造成系统停顿,而且会很频繁,每隔几分钟就有一次,所以还得改善。UseCMSCompactAtFullCollection是表是执行FullGC后对内存进行整理压缩,免得产生内存碎片,CMSFullGCsBeforeCompaction=N表示执行N次FullGC后执行内存压缩。
    
    四:JVM调优之增量回收
    
    完成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这个参数也是我认为比较有用的,官方解释是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttimetheywerereferenced.Thedefaultvalueisonesecondoflifetimeperfreemegabyteintheheap,我觉得没必要等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秒,看来问题应该暂时解决了。

http://www.holdjava.com/jvmjishu/28979.htm

JVM调优的几种策略(转)的更多相关文章

  1. JVM调优的几种策略

    一.JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从J ...

  2. jvm调优的几种场景

    假定你已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器. 一.cpu占用过高 cpu占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束 ...

  3. jvm调优神器——arthas

    在上一篇<jvm调优的几种场景>中介绍了几种常见的jvm方面调优的场景,用的都是jdk自带的小工具,比如jps.jmap.jstack等.用这些自带的工具排查问题时最大的痛点就是过程比较麻 ...

  4. JVM调优浅谈

    1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...

  5. JVM调优总结 + jstat 分析(转)

    [转] JVM调优总结 + jstat 分析 JVM调优总结 + jstat 分析 jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause pid 2000 每格2秒 ...

  6. JVM调优总结(五)-分代垃圾回收详述1

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  7. JVM调优实战

      JVM调优实战 文档修订记录 版本 日期 撰写人 审核人 批准人 变更摘要 & 修订位置                                                   ...

  8. 老李分享:JVM调优

    老李分享:JVM调优   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨 ...

  9. JVM调优总结:分代垃圾回收详述

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

随机推荐

  1. Effective Java2读书笔记-创建和销毁对象(二)

    第3条:用私有构造器或者枚举类型强化Singleton属性 这一条,总体来说,就是讲了一个小技巧,将构造器声明为private,可以实现单例.具体有以下几种实现的方式. ①最传统的单例实现模式,可能有 ...

  2. USB系列之六:基于DOSUSB的简单U盘驱动程序

    首先要说明的是,该驱动程序仅实现了部分块设备的功能,如果作为成品软件使用,会感觉性能比较差,而且有些功能(比如FORMAT)是不能完成的,发表此驱动程序的目的旨在说明USB的编程原理以及DOS下驱动程 ...

  3. C语言超级经典400道题目

    C语言超级经典400道题目 1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____构A.顺序结构,选择结构,循环结 B.递 ...

  4. Qt之Windows资源文件(.rc文件)

    简述 在Windows下使用Qt时,通常会用到Windows的资源文件 - 为exe设置信息,其中包括:文件说明.产品名称.产品版本.版权等信息... 由于是Windows平台相关的东西,Qt助手中对 ...

  5. javascript之对象

    一.创建对象 1.对象直接量. var point = { x:0,y:0 }; //point就是一个对象,跟C#不同,它不需要一定有类才能创建对象. 2.通过new创建对象 var d = new ...

  6. 开源欣赏wordpress之文章新增页面如何实现。

    本地网址http://localhost/wordpress/wp-admin/post-new.php 进而找到post-new.php页面. 进入之后, require_once( dirname ...

  7. 【转】 linux内核移植和网卡驱动(二)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708911.html 一,内核移植步骤: 1, 修改顶层目录下的Makefile ARCH       ...

  8. loadlibrary(xxx.dll) 失败 返回14001 由于应用程序配置不正确 应用程序未能启动.重新安装应用程序可能会纠正这个问 .

    欢迎大家拍砖! 一.应用背景 有一个在win7中用VS2008编译成功,运行正常的程序:Exe+DLL; 放到XP虚拟镜像上运行却提示:LoadLibrary返回14001. (1) 后来采用了下面方 ...

  9. JS闭包的概念

    原文地址:http://zhidao.baidu.com/link?url=f81iaijX6nzY99Wz43v-p_qZEn4cCaomT4LD6NH5jVtI0yK2V76VJWefih51vA ...

  10. sh_脚本语法

    介绍: 1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编写脚 ...