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

GC策略的调优

    博客分类:
  • j2ee
阅读更多

GC 策略在 G1 还没成熟的情况下,目前主要有串行、并行和并发三种,对于大内存的应用而言,串行的性能太低,因此使用到的主要是并行和并发两种,具体这两种 GC 的策略在深入 JVM 章节中已讲解, 并行和并发 GC 的策略通过 -XX:+UseParallelGC -XX:+UseConcMarkSweepGC 来指定,还有一些细节的配置参数用来配置策略的执行方式,例如: -XX:ParallelGCThreads -XX:CMSInitiatingOccupancyFraction 等,新生代对象回收只可选择并行,在此就举例来看看两种 GC 策略在 Full GC 时的具体表现状况。

测试 GC 策略状况的代码如下:

public   class  GCPolicyDemo {
 
    
/**
     * 
@param  args
     
*/
    
public   static   void  main(String[] args)  throws  Exception{
       System.out.println(
" ready to start " );
       Thread.sleep(
10000 );
       List
< GCPolicyDataObject >  cacheObjects = new  ArrayList < GCPolicyDataObject > ();
       
for  ( int  i  =   0 ; i  <   2048 ; i ++ ) {
           cacheObjects.add(
new  GCPolicyDataObject( 100 ));
       }
       System.gc();
       Thread.sleep(
1000 );
       
for  ( int  i  =   0 ; i  <   10 ; i ++ ) {
           System.out.println(
" Round:  " + (i + 1 ));
           
for  ( int  j  =   0 ; j  <   5 ; j ++ ) {
              System.out.println(
" put 64M objects " );
              List
< GCPolicyDataObject >  tmpObjects = new  ArrayList < GCPolicyDataObject > ();
              
for  ( int  m  =   0 ; m  <   1024 ; m ++ ) {
                  tmpObjects.add(
new  GCPolicyDataObject( 64 ));
              }
              tmpObjects
= null ;
           }
       }
       cacheObjects.size();
       cacheObjects
= null ;
    }
 
}
 
class  GCPolicyDataObject{
   
    
byte [] bytes = null ;
   
    GCPolicyRefObject object
= null ;
   
    
public  GCPolicyDataObject( int  factor){
       bytes
= new   byte [factor * 1024 ];
       object
= new  GCPolicyRefObject();
    }
   
}
 
class  GCPolicyRefObject{
   
    GCPolicyRefChildObject object;
   
    
public  GCPolicyRefObject(){
       object
= new  GCPolicyRefChildObject();
    }
   
}
 
class  GCPolicyRefChildObject{
   
    
public  GCPolicyRefChildObject(){
       ;
    }
   
}

 

-Xms680M -Xmx680M -Xmn80M -XX:+UseConcMarkSweepGC -XX:+PrintGCApplicationStoppedTime -XX:+UseCMSCompactAtFullCollection -XX:+UseParNewGC -XX:CMSMaxAbortablePrecleanTime=5 参数执行以上代码,通过 jstat 观察到的 GC 状况如下:

共触发 39 minor GC ,耗时为 1.197 秒,共触发 21 Full GC ,耗时为 0.136 秒, GC 总耗时为 1.333 秒。

GC 动作造成应用暂停的时间为: 1.74 秒。

-Xms680M -Xmx680M -Xmn80M -XX:+PrintGCApplicationStoppedTime –XX:+UseParallelGC 参数执行以上代码,通过 jstat 观察到的 GC 状况如下:

共触发 119 minor GC ,耗时为 2.774 秒,共触发 8 Full GC ,耗时为 0.243 秒, GC 总耗时为 3.016 秒。

GC 动作造成应用暂停的时间为: 3.11 秒。

从上面的结果来看,由于 CMS GC 多数动作是和应用并发做的,采用 CMS GC 确实可以减小 GC 动作给应用造成的暂停,但也正因为是并发进行的,因此 CMS GC 需要耗费更多的 CPU ,因此对于 CPU 密集型应用而言, CMS 不一定是好的选择。

在采用 CMS GC 的情况下,尤其要注意的是 concurrent mode failure 的现象,这可以通过 -XX:+PrintGCDetails 来观察,当出现 concurrent mode failure 的现象时,就意味着此时 JVM 将继续采用 Stop-The-World 的方式来进行 Full GC ,这种情况下,采用 CMS 就没什么意义了,造成 concurrent mode failure 的原因主要是当 minor GC 进行时,旧生代所剩下的空间小于 Eden 区域 +From 区域的空间,要避免这种现象,可以采用以下三种方法:

l  调低触发 CMS GC 执行的阀值

CMS GC 触发主要由 CMSInitiatingOccupancyFraction 值决定,默认情况是当旧生代已用空间为 68% 时,即触发 CMS GC

在出现 concurrent mode failure 的情况下,可考虑调小这个值,提前 CMS GC 的触发,以保证旧生代有足够的空间。

l  扩大旧生代空间

调小新生代占用的空间或增大整个 JVM Heap 的空间可扩大旧生代空间,这对于避免 concurrent mode failure 现象可以提供很大的帮助。

l  调小 CMSMaxAbortablePrecleanTime 的值

CMS GC 需要经过较多步骤才能完成一次 GC 的动作,在 minor GC 较为频繁的情况下,很有可能造成 CMS GC 尚未完成,从而造成 concurrent mode failure ,这种情况下,减少 minor GC 触发的频率是一种方法,另外一种方法则是加快 CMS GC 执行时间,在 CMS 的整个步骤中, JDK 5.0+ 6.0+ 的有些版本在 CMS-concurrent-abortable-preclean-start CMS-concurrent-abortable-preclean 这两步间有可能会耗费很长的时间,导致可回收的旧生代的对象很长时间后才被回收,这是 Sun JDK CMS GC 的一个 bug[1] ,如通过 PrintGCDetails 观察到这两步之间耗费了较长的时间,可以通过 -XX: CMSMaxAbortablePrecleanTime 设置较小的值,以保证 CMS GC 尽快完成对象的回收,避免 concurrent mode failure 的现象。



[1] 详细 bug 信息请见: http://www.nabble.com/CMS-GC-tuning-under-JVM-5.0-td16759819.html

分享到:
评论

相关推荐

    JVM垃圾回收机制与GC性能调优

    本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用程序的主要内存区域,用于存储所有类实例和数组。它分为三个主要区域:新域(Young Generation)、旧域(Old Generation)和...

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G)

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...

    Java GC与性能调优

    Java GC与性能调优 Java GC与性能调优是 Java programming language 中非常重要的一部分,直接影响着 Java application 的性能。本文档将对 Java GC 与性能调优进行详细的介绍。 一、 Java 平台的逻辑结构 Java ...

    JVM_GC调优

    合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的垃圾回收策略。同时,掌握JVM内存模型和垃圾回收器的工作原理也是进行有效调优的...

    JVM体系结构与GC调优

    4. **内存分配与GC策略** - **年轻代与老年代**:新生代用于存放新创建的对象,老年代存放长期存活的对象。 - **对象晋升**:当对象在年轻代存活足够长的时间后,会被晋升到老年代。 - **Minor GC与Full GC**:...

    jvm gc jvm调优 查看工具

    JVM调优通常涉及到内存配置、GC策略选择以及监控工具的使用,以便确保应用的高效稳定运行。 在Java世界中,GC的主要目标是自动管理应用程序的内存,通过自动回收不再使用的对象来避免内存泄漏。GC的工作机制包括...

    Java_GC垃圾回收调优指南

    本指南旨在帮助开发者深入理解Java GC的工作原理,并提供一系列调优策略与实例,以确保Java应用能够高效稳定地运行。 #### Java GC基础知识 垃圾回收是一种自动化的内存管理机制,它负责回收不再使用的对象所占用...

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

    理解JIT编译器的作用,以及如何通过-XX:+UseConcMarkSweepGC等参数启用特定的GC策略也是调优的重要环节。 总之,《JVM、GC详解及调优》这份资料将带你深入了解JVM的工作原理,帮助你掌握GC的运作机制,并提供实用的...

    jvm和gc详解及调优

    5. **GC调优**:包括如何分析GC日志,理解GC停顿(Stop-the-World)事件,以及如何通过调整JVM参数来改善系统性能,如设置堆大小、新生代与老年代的比例、存活代的晋升策略等。 6. **性能监控与诊断工具**:如...

    JVM、GC详解及调优

    2. **GC策略选择**:根据应用特性选择合适的GC策略,例如,对响应时间敏感的应用可以选择低延迟的G1或ZGC。 3. **监控与诊断**:使用JVisualVM、JConsole、JFR等工具进行实时监控,分析GC日志,找出性能瓶颈。 4. ...

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

    1. **垃圾收集器选择**:JVM提供了多种垃圾收集器,如Serial、Parallel、CMS、G1和ZGC等,每种收集器有不同的性能特征,需要根据应用的特性选择合适的GC策略。 2. **内存区域设置**:包括新生代、老年代、永久代...

    JavaGC调优基础.pdf

    总之,Java GC调优是一个复杂而细致的过程,需要综合考虑多个因素,包括但不限于堆大小、操作系统资源、JVM版本、GC策略和应用特性。通过合理的调优,可以有效地提升Java应用的性能,降低系统资源的消耗。

    GC调优(入门篇)

    可见,无论使用多少堆外内存,对JVM内存的使用终究是绕不过去,既然绕不过去...本文就将会介绍HBase应用场景下CMS GC策略的调优技巧,后续还会针对另一业界开始使用的GC策略-G1GC策略在HBase应用场景下进行调优介绍。

    用于测试jvm gc调优-share-jvm-gc.zip

    2. **GC策略选择**:根据应用的特性(如是否需要低延迟、是否容忍内存碎片等)选择合适的垃圾收集器。例如,对于需要低延迟的服务,可以选择CMS或G1;对于服务器应用,可能更适合Parallel或ZGC。 3. **监控和诊断**...

    java gc调优

    1. **选择合适的GC策略**:根据应用的需求(如低延迟、高吞吐量)选择最适合的GC算法。 2. **调整内存大小**:合理设定堆内存大小,避免OutOfMemoryError。 3. **监控GC行为**:使用JConsole、VisualVM或JMX等工具...

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战 一线架构师带你抗住压力

    来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就会发现非常的强悍,课程从思路和实际案例的角度出发,非常全面的像同学们诠释了...

    JVM体系结构与GC调优PPT

    JVM体系结构与GC调优,内容涉及JVM的垃圾回收的各种策略和JVM的各种内存的结构的分配

Global site tag (gtag.js) - Google Analytics