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
相关推荐
主要包括以下几种: - **标记-清除算法**(Mark-Sweep):首先标记所有需要回收的对象,然后统一回收这些标记过的对象。该算法的缺点是会导致内存碎片化。 - **复制算法**(Copying):将内存分为大小相等的两块,...
JVM调优主要包括以下几个方面: 1. **内存管理**:JVM内存分为堆内存和栈内存,其中堆内存又分为新生代、老年代和永久代(Java 8后改为元空间)。合理的设置各区域大小,如新生代与老年代的比例,可以有效避免垃圾...
特别要关注 Full GC,因为它会对整个堆进行整理,导致 Full GC 一般由于以下几种情况: 旧生代空间不足;Perm Gen 空间不足;统计得到的 GC 后晋升到旧生代的平均大小大于旧生代剩余空间;控制好新生代和旧生代的...
JVM调优涉及到许多方面,包括堆大小设置(新生代、老年代)、GC策略选择、元空间大小、栈深度等。调优的目标通常是为了平衡应用的响应速度、内存使用和系统资源的消耗。 - **新生代与老年代的大小调整**:新生代...
本文将详细介绍几种常用的垃圾收集(GC)策略及其配置方法,并深入探讨如何针对不同的应用场景选择合适的策略。 #### 常见的GC策略 在Java虚拟机中,垃圾收集主要分为两大阶段:新生代垃圾收集和老年代垃圾收集。...
GC(Garbage Collection)调优和JVM调优是优化Java应用性能的关键环节,尤其是在处理大量数据或者高并发场景时显得尤为重要。 GC调优主要是对JVM的垃圾回收机制进行调整,以确保内存的有效利用和避免系统出现长时间...
JVM调优主要关注内存分配、垃圾收集策略以及类加载机制。常见的调优参数包括: - `-Xms` 和 `-Xmx`:设置堆内存的初始大小和最大大小。 - `-XX:NewRatio` 和 `-XX:SurvivorRatio`:控制新生代和Survivor区的比例。 ...
JVM调优主要包括以下几个方面: 1. **内存配置**:理解堆内存的结构,包括年轻代(Young Generation)、老年代(Tenured Generation)和永久代(Perm Generation)。根据应用的特点调整新生代、老年代的大小,以及...
线上服务的JVM调优实践通常会根据系统需求分为两种策略: 1. 吞吐量优先:优化目标是提高程序运行的整体速度,可能允许较长的响应时间以换取更高的处理能力,适合后台批处理任务。 2. 响应时间优先:强调快速响应...
本文将探讨两种常见的JVM调优场景:CPU占用过高和死锁。 首先,我们来看CPU占用过高的情况。当CPU使用率长时间居高不下时,可能是由于代码中的循环次数过多或者存在死循环导致的。解决这个问题需要通过以下步骤: ...
### JVM调优与内存管理详解 #### 调优目标及基本概念 ...通过上述步骤和技术细节的介绍,我们可以看到JVM调优是一项复杂而又细致的工作,需要根据具体情况灵活运用各种技术和策略,才能达到最佳的性能优化效果。
在JVM调优方面,主要涉及以下几个核心知识点: 1. **内存模型**:Java的内存模型分为堆内存(Heap)、虚拟机栈(JVM Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(PC Register...
JVM调优主要包括以下几个方面: 1. **内存大小设置**:合理设定堆和方法区的初始值和最大值,避免内存过小导致频繁GC或过大浪费资源。 2. **垃圾收集器选择**:不同的GC策略对应用性能有很大影响,如CMS、G1、ZGC等...
### JVM调优文档:垃圾收集(GC)与性能优化 #### 概述 Java虚拟机(JVM)作为运行Java程序的核心组件,其性能直接影响着应用程序的运行效率和稳定性。在JVM中,垃圾收集(GC)是自动管理内存的重要机制之一。本文...
2.几种垃圾回收机制 2.1.标记-清除收集器 这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。 2.2.标记-压缩收集器 ...
在JVM调优方面,我们需要关注几个关键参数: 1. **内存设置**:包括堆内存(`-Xms`和`-Xmx`)、新生代大小(`-Xmn`)、Survivor区比例(`-XX:SurvivorRatio`)以及eden区和持久代的大小等。 2. **垃圾收集器选择**...
### JVM优化与OOM分析 #### 一、JVM的重要性与作用 JVM(Java Virtual Machine)...本文档通过具体的案例分析,介绍了JVM的基本概念、工作原理以及调优技巧,希望能够帮助开发者更好地理解和掌握JVM调优的相关知识。
当遇到GC问题,如Full GC过于频繁或执行时间过长,有几种应对策略: 1. 增加内存,特别是年轻代的内存。 2. 使用LRU缓存或其他策略限制大量对象的创建,减少内存压力。 3. 在64位系统下,启用对象头压缩(如`-XX:+...
此外,JVM调优还包括JVM参数的调整,如堆大小(-Xms, -Xmx)、初始堆大小(-Xmn)、Metaspace大小(-XX:MaxMetaspaceSize)等。理解JIT编译器的作用,以及如何通过-XX:+UseConcMarkSweepGC等参数启用特定的GC策略也...