`
ikon
  • 浏览: 107862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM调优的几种策略(好)

    博客分类:
  • jvm
 
阅读更多

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秒,看来问题应该暂时解决了。

  参数不明白的可以上网查,本人认为比较重要的几个参数是:

  -Xms-Xmx-XmnMaxTenuringThresholdGCTimeRatioUse

  ConcMarkSweepGCCMSInitiatingOccupancyFractionSoftRefLRUPolicyMSPerMB

  eclipse中配置JVM参数:-Xmx1024M-Xms1000M-server-XX:PermSize=64M-XX:MaxPermSize=128m

分享到:
评论

相关推荐

    马士兵jvm调优笔记.docx

    主要包括以下几种: - **标记-清除算法**(Mark-Sweep):首先标记所有需要回收的对象,然后统一回收这些标记过的对象。该算法的缺点是会导致内存碎片化。 - **复制算法**(Copying):将内存分为大小相等的两块,...

    monkey老师的jvm 调优

    JVM调优主要包括以下几个方面: 1. **内存管理**:JVM内存分为堆内存和栈内存,其中堆内存又分为新生代、老年代和永久代(Java 8后改为元空间)。合理的设置各区域大小,如新生代与老年代的比例,可以有效避免垃圾...

    jvm常用调优方式

    特别要关注 Full GC,因为它会对整个堆进行整理,导致 Full GC 一般由于以下几种情况: 旧生代空间不足;Perm Gen 空间不足;统计得到的 GC 后晋升到旧生代的平均大小大于旧生代剩余空间;控制好新生代和旧生代的...

    JVM调优,GC算法汇总

    JVM调优涉及到许多方面,包括堆大小设置(新生代、老年代)、GC策略选择、元空间大小、栈深度等。调优的目标通常是为了平衡应用的响应速度、内存使用和系统资源的消耗。 - **新生代与老年代的大小调整**:新生代...

    jvm 调优的详细介绍

    本文将详细介绍几种常用的垃圾收集(GC)策略及其配置方法,并深入探讨如何针对不同的应用场景选择合适的策略。 #### 常见的GC策略 在Java虚拟机中,垃圾收集主要分为两大阶段:新生代垃圾收集和老年代垃圾收集。...

    gc调优,和jvm调优,特别详细,这是本人花人民币买的

    GC(Garbage Collection)调优和JVM调优是优化Java应用性能的关键环节,尤其是在处理大量数据或者高并发场景时显得尤为重要。 GC调优主要是对JVM的垃圾回收机制进行调整,以确保内存的有效利用和避免系统出现长时间...

    JVM 监控 调优 工具

    JVM调优主要关注内存分配、垃圾收集策略以及类加载机制。常见的调优参数包括: - `-Xms` 和 `-Xmx`:设置堆内存的初始大小和最大大小。 - `-XX:NewRatio` 和 `-XX:SurvivorRatio`:控制新生代和Survivor区的比例。 ...

    Java问题定位技术(书签版)—JVM调优

    JVM调优主要包括以下几个方面: 1. **内存配置**:理解堆内存的结构,包括年轻代(Young Generation)、老年代(Tenured Generation)和永久代(Perm Generation)。根据应用的特点调整新生代、老年代的大小,以及...

    第四讲-JVM调优原理深度剖析、服务线上优化实践.pdf

    线上服务的JVM调优实践通常会根据系统需求分为两种策略: 1. 吞吐量优先:优化目标是提高程序运行的整体速度,可能允许较长的响应时间以换取更高的处理能力,适合后台批处理任务。 2. 响应时间优先:强调快速响应...

    这几种常见的JVM调优场景你知道吗?

    本文将探讨两种常见的JVM调优场景:CPU占用过高和死锁。 首先,我们来看CPU占用过高的情况。当CPU使用率长时间居高不下时,可能是由于代码中的循环次数过多或者存在死循环导致的。解决这个问题需要通过以下步骤: ...

    jvm调优,内存管理

    ### JVM调优与内存管理详解 #### 调优目标及基本概念 ...通过上述步骤和技术细节的介绍,我们可以看到JVM调优是一项复杂而又细致的工作,需要根据具体情况灵活运用各种技术和策略,才能达到最佳的性能优化效果。

    JVM调优总结与ava虚拟机:JVM高级特性与最佳实践(最新第二版)

    在JVM调优方面,主要涉及以下几个核心知识点: 1. **内存模型**:Java的内存模型分为堆内存(Heap)、虚拟机栈(JVM Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(PC Register...

    用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip

    JVM调优主要包括以下几个方面: 1. **内存大小设置**:合理设定堆和方法区的初始值和最大值,避免内存过小导致频繁GC或过大浪费资源。 2. **垃圾收集器选择**:不同的GC策略对应用性能有很大影响,如CMS、G1、ZGC等...

    JVM调优文档,自己总结汇总关于GC和性能的文章

    ### JVM调优文档:垃圾收集(GC)与性能优化 #### 概述 Java虚拟机(JVM)作为运行Java程序的核心组件,其性能直接影响着应用程序的运行效率和稳定性。在JVM中,垃圾收集(GC)是自动管理内存的重要机制之一。本文...

    resin-jvm 调优

    2.几种垃圾回收机制 2.1.标记-清除收集器 这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。 2.2.标记-压缩收集器 ...

    Java性能监控与调优Demo,主要学习各种JDK监控工具以及jvm调优-monitor_tuning_Demo.zip

    在JVM调优方面,我们需要关注几个关键参数: 1. **内存设置**:包括堆内存(`-Xms`和`-Xmx`)、新生代大小(`-Xmn`)、Survivor区比例(`-XX:SurvivorRatio`)以及eden区和持久代的大小等。 2. **垃圾收集器选择**...

    JVM优化与OOM分析PPT

    ### JVM优化与OOM分析 #### 一、JVM的重要性与作用 JVM(Java Virtual Machine)...本文档通过具体的案例分析,介绍了JVM的基本概念、工作原理以及调优技巧,希望能够帮助开发者更好地理解和掌握JVM调优的相关知识。

    实用:多场景JVM参数调优实战.docx

    当遇到GC问题,如Full GC过于频繁或执行时间过长,有几种应对策略: 1. 增加内存,特别是年轻代的内存。 2. 使用LRU缓存或其他策略限制大量对象的创建,减少内存压力。 3. 在64位系统下,启用对象头压缩(如`-XX:+...

    JVM、GC详解及调优_jvm_JVM、GC详解及调优_

    此外,JVM调优还包括JVM参数的调整,如堆大小(-Xms, -Xmx)、初始堆大小(-Xmn)、Metaspace大小(-XX:MaxMetaspaceSize)等。理解JIT编译器的作用,以及如何通过-XX:+UseConcMarkSweepGC等参数启用特定的GC策略也...

Global site tag (gtag.js) - Google Analytics