当前位置: 首页 > article >正文

为什么Java8不使用CMS作为默认垃圾收集器

一般的垃圾回收器搭配为:

Serial New + Serial Old
ParNew + CMS + Serial Old
Parallel Scavenge + Parallel Old
G1
shenandoah
zgc

历代版本的默认收集器始终没有使用CMS作为默认收集器,在jdk9 G1成为default gc策略之后,CMS就被deprecated,然后在14被正式从jdk中删除。Java官方做出这样的决定肯定是有原因的,虽然CMS相比Parallel是后推出的收集器,但并不意味CMS比Parallel强。

CMS是关注低延迟的收集器,Parallel是关注高吞吐量的收集器,在一般的服务端中大型系统中,高吞吐量仍然是很多程序追求的重点,况且linux和网络本身就就会有停顿,造成延迟的效果。

  1. CMS在GC时会对CPU有比较大的压力,形成典型的CPU Spike。

  2. CMS仅针对老年代,还需要一个年轻代的收集器。CMS又和Parallel

  3. Scavenge不兼容,只能和ParNew凑合,然而ParNew又不如Parallel Scavenge先进。

  4. CMS没法处理浮动垃圾,并发标记过程中死亡的对象只能留到以后的GC处理。

  5. Mark-Sweep算法对内存碎片无能为力,并发又如何?内存碎片太多,触发了Concurrent Mode Failure还不是得去请Serial Old来收拾烂摊子?结果就是stop the world。

…以上的种种,造成的结果就是ParNew+CMS+Serial Old的组合工作起来其实并不稳定。为了得到CMS那一点好处,需要付出很多的代价(包括JVM调参)。所以作为默认GC,采用Parallel Scavenge/Parallel Old这种省心又省力方案完全合理。况且之后出现的G1收集器无需复杂的配置即可达到很高的综合性能,CMS就更没必要了。

参考:https://www.zhihu.com/question/418331009


http://www.kler.cn/a/9815.html

相关文章:

  • GitLab实现 HTTP 访问和 SMTP 邮件发送
  • 有什么初学算法的书籍推荐?
  • 【机器学习】机器学习中用到的高等数学知识-3.微积分 (Calculus)
  • 从0开始学docker (每日更新 24-11-7)
  • 009_SSH_Mysql图书管理系统(学生注册 借书 还书 绵阳)——lwplus87(免费送)
  • js.零钱兑换
  • 死锁的检测和案例
  • Qt使用std::thread更新QPlainTextEdit内容
  • 透过Gartner最新报告,认识“超级边缘”
  • Java 包详细讲解
  • ChatGPT想干掉开发人员,做梦去吧
  • ERTEC200P-2 PROFINET设备完全开发手册(4-2)
  • 4.9--计算机网络之TCP篇之TCP 重传、滑动窗口、流量控制、拥塞控制--(复习+大总结)---好好沉淀,沉下心来
  • 真题详解(Flynn分类)-软件设计(四十六)
  • 【Linux】线程概念详析
  • 博客平台用户模块设计原则:构建简洁、高效的用户体验
  • 100种思维模型之非共识思维模型-48
  • 板块模型构建、k点选定及Miller指数对表面分类
  • 代码随想录算法训练营第五十二天 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
  • 液压传动与控制实验教学培训系统平台
  • Bootloader的作用
  • [ 应急响应基础篇 ] Windows系统隐藏账户详解(Windows留后门账号)
  • 从存算分离说起:金融行业数据库分布式改造之路
  • 【Linux】工具(5)——gdb
  • 浏览器:好用的浏览器插件,亲测好用
  • 分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?