`
blueswind8306
  • 浏览: 127012 次
  • 来自: ...
社区版块
存档分类
最新评论

CMSGC造成内存碎片的解决方法

阅读更多
我们知道,CMSGC在老生代回收时产生的内存碎片会导致老生代的利用率变低;或者可能在老生代总内存大小足够的情况下,却不能容纳新生代的晋升行为(由于没有连续的内存空间可用),导致触发FullGC。针对这个问题,Sun官方给出了以下的四种解决方法:
  • 增大Xmx或者减少Xmn
  • 在应用访问量最低的时候,在程序中主动调用System.gc(),比如每天凌晨。
  • 在应用启动并完成所有初始化工作后,主动调用System.gc(),它可以将初始化的数据压缩到一个单独的chunk中,以腾出更多的连续内存空间给新生代晋升使用。
  • 降低-XX:CMSInitiatingOccupancyFraction参数以提早执行CMSGC动作,虽然CMSGC不会进行内存碎片的压缩整理,但它会合并老生代中相邻的free空间。这样就可以容纳更多的新生代晋升行为。

原文引用:
引用
What should you do if you run into a fragmentation problem?
Try 5.0.
Or you could try a larger total heap and/or smaller young generation. If your application is on the edge, it might give you just enough extra space to fit all your live data. But often it just delays the problem.
Or you can try to make you application do a full, compacting collection at a time which will not disturb your users. If your application can go for a day without hitting a fragmentation problem, try a System.gc() in the middle of the night. That will compact the heap and you can hopefully go another day without hitting the fragmentation problem. Clearly no help for an application that does not have a logical "middle of the night".
Or if by chance most of the data in the tenured generation is read in when your application first starts up and you can do a System.gc() after you complete initialization, that might help by compacting all data into a single chunk leaving the rest of the tenured generation available for promotions. Depending on the allocation pattern of the application, that might be adequate.
Or you might want to start the concurrent collections earlier. The low pause collector tries to start a concurrent collection just in time (with some safety factor) to collect the tenured generation before it is full. If you are doing concurrent collections and freeing enough space, you can try starting a concurrent collection sooner so that it finishes before the fragmentation becomes a problem. The concurrent collections don't do a compaction, but they do coalese adjacent free blocks so larger chunks of free space can result from a concurrent collection. One of the triggers for starting a concurrent collection is the amount of free space in the tenured generation. You can cause a concurrent collection to occur early by setting the option -XX:CMSInitiatingOccupancyFraction= where NNN is the percentage of the tenured generation that is in use above which a concurrent collection is started. This will increase the overall time you spend doing GC but may avoid the fragmentation problem. And this will be more effective with 5.0 because a single contiguous chunk of space is not required for promotions.

我在实际应用中的调优是:
  • 在应用启动并完成所有初始化工作后,主动调用System.gc()。
  • 在Xmx不变的情况下,保持SuvivorSpace不变(为了不让每次MinorGC的晋升大小增加),降低Xmn。
  • 降低-XX:CMSInitiatingOccupancyFraction

我认为在程序中调用System.gc()并不是一个很好的选择,因为:
  • FullGC一定会导致应用暂停,而有些高并发应用是不允许有一次FullGC的,so...
  • 在jdk1.6的某个版本中,调用System.gc()并且应用中有nio操作的话,会导致应用挂起的Bug

另外的一种方法是(没用过,仅供参考):
http://kenwublog.com/avoid-full-gc-in-hbase-using-arena-allocation

分享到:
评论

相关推荐

    JAVA gc日志分析工具GChisto及CMS GC补丁

    GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...

    Java 内存区域和GC机制

    - **CMS(Concurrent Mark Sweep)GC**:并发标记清除,减少STW时间,但可能出现浮动垃圾和内存碎片问题。 - **G1(Garbage-First)GC**:基于region的收集器,目标是预测和控制停顿时间,适用于大型应用。 - **...

    简易cms内存管理系统

    【简易CMS内存管理系统】是一...通过学习和实践这个简易CMS内存管理系统,开发者可以深化对内存管理的理解,提高在实际项目中的问题解决能力。在实际开发过程中,结合这些知识点,可以创建出更高效、更稳定的软件系统。

    mac mat jvm gc 内存分析

    3. CMS GC:并发标记清除算法,尽可能减少应用暂停时间,但可能会导致内存碎片。 4. G1 GC:最新的垃圾收集器,目标是实现低暂停时间和可预测的内存回收。 了解JVM GC的工作原理对于优化Java应用的性能至关重要。...

    关于(java heap space)内存溢出的解决办法

    - 选择合适的垃圾收集器:如G1、Parallel GC、CMS等,每种收集器都有其适用场景。 - 调整垃圾收集频率和策略:通过`-XX:+UseConcMarkSweepGC`等参数进行调整。 ### 4. 使用工具 - 使用Java自带的JConsole或...

    内存溢出解决

    #### 解决Java内存溢出的方法 ##### 1. **理解内存结构** 在深入探讨解决方案之前,首先需要了解Java虚拟机(JVM)的内存布局: - **堆内存**:存放对象实例和数组。 - **栈内存**:线程私有的,用于存储局部变量...

    Java 内存溢出解决办法

    在Java中,内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area,Java 8后被元空间取代)以及程序计数器和本地方法栈。当"Java.lang.OutOfMemoryError: Java heap space"错误出现时,表示程序运行过程...

    EdwardLee03#issue-case#万恶的swap(CMS GC的remark耗时好几秒)1

    【现象】悲催的是运行了几天后,突然有几台机器开始报警,上机器看到的现象是CMS GC的remark竟然花了20s+,而实际上这个时候old也就用了2g+,这个时

    解决tomcat内存溢出的配置方法

    2. **设置PermGen或Metaspace大小**:在Java 8以前, PermGen是存放类和方法的元数据区域,经常引发内存溢出。在Java 8及以后版本,这部分被替换为Metaspace。同样,我们可以通过`-XX:MaxMetaspaceSize`来设置最大元...

    JVM初探- 内存分配、GC原理与垃圾收集器

    而老年代由于对象存活率高,没有额外的空间进行分配担保,因此通常使用“标记—清理”或“标记—整理”算法进行回收,这些算法直接清理不再使用的对象,整理剩余的存活对象,以避免内存碎片化。 除了分代收集算法,...

    帝国CMS7.0碎片功能升级后的使用方法详解

    帝国CMS7.0的碎片功能是一种便捷的网站内容管理手段,允许用户以模块化的方式管理网站内容。碎片是可复用的内容单元,可以包含文本、图片、链接等多种元素,并且支持在不同页面间进行调用。随着CMS版本的迭代,帝国...

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

    此外,监控GC日志,分析GC行为,以及使用适当的GC算法(如CMS、G1或ZGC)也是优化过程中的关键步骤。通过这些实践,开发者能够确保Java应用程序在运行时具有良好的内存管理和高效的资源利用率。

    CMS垃圾收集器1

    CMS提供了一些参数来优化其行为,比如`UseCMSCompactAtFullCollection`用于在Full GC时进行内存碎片整理,以及`CMSFullGCsBeforeCompaction`来控制每隔多少次不压缩的Full GC后执行一次带压缩的Full GC。 然而,CMS...

    java实现的内存分配

    这种方法有助于防止内存碎片,但可能不适合处理优先级不同的任务。 高优先权法(Priority-Based Allocation)则更关注任务的优先级,将内存分配给优先级更高的任务。在Java中,可以利用优先级队列(PriorityQueue)...

    JVM-内存管理 2012-12.pdf

    这些算法被不同的垃圾收集器实现,如Serial GC、Parallel GC、CMS GC和G1 GC等。垃圾收集器根据不同的应用场景和性能要求进行选择。 内存分析工具如jvisualvm、jmap、jhat和MAT(Memory Analyzer Tool)等,为Java...

    JVM内存日志

    - **内存碎片**:分析堆内存的碎片情况,如果碎片过多可能会影响性能。 - **类加载器**:检查类加载器的状态,有时内存泄漏与类加载器有关。 - **大对象**:查找占用大量内存的大对象,它们可能导致老年代快速填...

    苹果cms 图片不显示问题解决

    请将tu.php文件放到苹果cms根目录,即可解决采集视频图片不显示问题

    JVM常用的GC策略介绍

    - **缺点**:容易造成内存碎片化,当碎片积累过多时,可能会导致系统性能下降甚至崩溃。 ##### 2. Copying(复制)算法 **定义与原理**:为了解决Mark-Sweep算法中内存碎片化的问题,引入了复制算法。该算法将可用...

    gc回收机制

    4. **内存压缩**:为了防止内存碎片,GC有时会执行压缩操作,将存活的对象移动到一起,腾出连续的内存空间。这一步骤通常在老年代(Tenured Generation或Old Generation)进行。 5. **内存晋升**:新生代的对象如果...

Global site tag (gtag.js) - Google Analytics