博客
关于我
CMS垃圾回收器存在的问题及解决方案
阅读量:764 次
发布时间:2019-03-21

本文共 1346 字,大约阅读时间需要 4 分钟。

CMS垃圾回收机制深入解析

CMS(标记-清理算法)是一种广泛用于内存管理的垃圾回收机制,通过标记无效对象并在之后清理它们来释放内存。其核心流程包括初始标记、并发标记、重新标记以及并发清理四个主要阶段。了解这些流程及其对性能的影响,是优化虚拟机性能的关键。

并发消耗CPU资源

在CMS中,并发标记并发清理阶段需要大量的CPU资源,尤其是在多核处理器环境下。由于这些阶段的操作通常由多个线程同时执行,可能导致内存回收过程变得耗时且占用大量CPU资源,从而显著降低系统整体性能。

CMS默认线程数设置

为了减少对CPU资源的占用,CMS默认设置回收线程数为(CPU数 + 3)/4。这样一来:

  • 如果系统有4个核,回收线程数为7/4,即1或2个线程。
  • 如果有8个核,回收线程数为11/4,大约为2或3个线程。

这意味着:

  • 在CPU核数较多时,回收线程对性能的影响会相对降低。
  • 无论是8核还是16核,另外4个线程的开销对整体系统来说可以忽略不计。

并发更新失败

在并发清理阶段,系统采用了“并发破坏”方式,即正在运行的工作线程会被强行清理。这种方法虽然在某些情况下可以改善性能,但也可能导致问题:

  • 浮动垃圾处理不当:当线程正在运行时被终止,可能还没完成的对象会被标记为垃圾,但这些对象实际上仍有必要存活。
  • 内存碎片问题:由于不处理这些特殊情况,老年代内存空间可能无法存放这些必要的浮动垃圾,导致内存更新失败。
  • 性能下降:这种失败导致系统不得不切换到Serial Old垃圾回收器,以完成必要的清理任务,显著延长垃圾回收时间。
解决方法

为了减少并发更新失败的风险,建议设置-XX:CMSInitiatingOccupancyFraction参数:

  • 这个参数用于指定老年代内存使用率达到某一百分比后,系统才会触发垃圾回收。
  • 允许一部分内存用于存放浮动垃圾,避免并发更新失败。
  • 默认值为99%,可以根据需要进行微调。

空间碎片问题

由于采用标记-清理算法,系统可能会出现大量内存碎片。这种碎片主要存在于新生代,可能导致:

  • 对于大对象来说,寻找连续的内存空间变得困难。
  • 频繁触发垃圾回收,导致系统性能下降。
解决方法

在老年代内存管理中,CMS提供了两种解决方案:

  • 内存紧缩:通过-XX:+UseCMSCompactAtFullCollection参数设置,在每次完全垃圾回收后,停止工作线程,紧缩内存空间,将存活对象集中到内存的一端。

  • 碎片整理:通过-XX:+CMSFullGCsBeforeCompaction参数设置为0,表示每次完全垃圾回收后都会进行内存碎片整理。

    这两种机制可以有效减少内存碎片,避免因碎片过大而导致的性能问题。

  • 其他优化策略

    • 全盘垃圾回收:通过-XX:+UseCMSUpdateCompressedNormalHeap参数,可以在早期垃圾回收阶段对新生代进行压缩,减少内存碎片。
    • 增量式垃圾回收:在-XX:+CMSTriggerFinalizationAtNMT参数下,非对齐标记(NMT)触发最终化(Finalize)时,立即进行老年代垃圾回收,减少浮动垃圾的滞留。

    通过合理配置垃圾回收参数,可以最大限度地优化CMS在多核处理器上的表现,平衡系统内存使用和垃圾回收性能。

    转载地址:http://bgsgz.baihongyu.com/

    你可能感兴趣的文章
    mysql 存在update不存在insert
    查看>>
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>
    mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
    查看>>
    mysql 导入导出大文件
    查看>>
    mysql 将null转代为0
    查看>>
    mysql 常用
    查看>>
    MySQL 常用列类型
    查看>>
    mysql 常用命令
    查看>>
    Mysql 常见ALTER TABLE操作
    查看>>
    MySQL 常见的 9 种优化方法
    查看>>
    MySQL 常见的开放性问题
    查看>>
    Mysql 常见错误
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>