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

java cms gc_G1,CMS及PARALLEL GC的比较

G1,CMS及PARALLEL GC的比较

Published:

01 May 2014

Category:

这篇文章正好接上前一年我们做的一次现实环境下不同GC算法性能比较的试验。这次我们仍然进行同样的试验,不过增加了对G1回收器的测试,并且在多个平台进行测试。今年我们测试的垃圾回收器有如下几个:

-XX:+UseParallelOldGC

-XX:+UseConcMarkSweepGC

-XX:+UseG1GC

运行环境

我们使用现成的JIRA任务来运行这个测试。选择它的原因非常简单——除去Minecraft(一款著名网游),愤怒的小鸟,以及Eclipse不说, JIRA应该是最著名的Java应用程序了。并且和别的候选者相比,它更能代表我们日常的业务处理流程——毕竟来说Java用得最多的地方还是在服务端的Java企业级应用。

影响我们决定的还有一个因素—— Atlassian的工程师们发布了一个打包好的JIRA压测脚本 。我们可以直接用它来进行我们的基准测试。

我们仔细的将最新版的JIRA6.1解压,然后把它安装到Mac OS X Mavericks上。最后直接使用默认的内存参数设置来运行这个测试程序。Atlassian团队的家伙已经帮我们把参数也设置好了:

-Xms256m -Xmx768m -XX:MaxPermSize=256m

这个程序使用了JIRA的常见的几种不同功能——创建任务,分配任务,解析任务,查找及发现任务,等等。总的运行时间是30分钟。

我们使用了三种不同的GC算法来运行这个测试——Parallel,CMS, 和G1。每次测试都重新启动一个新的JVM实例,并事先把存储恢复到同样的状态。一切准备就绪后我们才开始启动压测。

结果

每次测试我们都通过-XX:+PrintGCTimeStamps -Xloggc:/tmp/gc.log -XX:+PrintGCDetails来收集GC日志,最后使用GCViewer来分析里面的数据。

汇总后的结果如下。注意测试结果的单位是毫秒。

年ParallelCMSG1

Total GC pauses20 93018 87062 000

Max GC pause7216450

说明

首先来看Parallel GC (-XX:+UseParallelOldGC)。在这30分钟的测试过程中,并行收集器的GC大概暂停了有21秒。最长的一次花了721毫秒。我们来以这个做为基准:从总的运行时间来看,GC周期减少了1.1%的吞吐量。最长的延迟时间大概是721毫秒。

下一个:CMS(-XX:+UseConcMarkSweepGC)。在30分钟的测试中,由于GC而损失的时间是19秒。吞吐量和上一次的并行模式下的差不多。不过时延方面有了明显的改善——最坏的情况下的时延减少了10倍!现在最大的GC暂停时间只有64毫秒。

最后一次测试用的是最新最潮的GC算法——GC(-XX:+UseG1GC)。运行的是同样的测试程序,不过结果的吞吐量则严重下降了。这次测试应用在GC上花费的时间超过了一分钟。和CMS只有1%的开销相比,这次的吞吐量下降了有3.5%。不过如果你不在乎吞吐量而更在乎时延的话——这方面它和前面表现最好的CMS相比还有20%的提升——G1回收器最长的暂停时间只有50ms。

结论

想通过这么一次试验来得出一个结论是非常危险的。如果你的时间充足又有相应的能力的话——你应该在自己的环境中具体情况具体分析,而不是使用一刀切的方法。

不过如果说非要得出一个结论,我认为说CMS仍然是最佳的默认选择。G1的吞吐量实在是太差,和它所减少的那点时延相比并不划算。

相关文章:

  • java以class开头_JAVA基础:从.class文件中寻找类名
  • Java 习题6 参考答案及解析_java期末复习题答案及解析
  • 猜字小游戏java方法体_java实现猜字小游戏
  • java游戏开发包_LWJGL
  • java的人patch方法_java – 如何在CXF中使用PATCH方法
  • java func_Java通过匿名类来实现回调函数实例总结
  • Java关系表达式x y_Java正则逻辑运算符[X|Y]匹配
  • java将五元换成1元5角_C,一个代码来获得一笔钱转换成四分之一,硬币,镍币,便士[关闭]...
  • java 对方 GBK 乱码_【转】Java编码与乱码---GBK与UTF-8之间的转换
  • mySQL表变量和临时表的区别_SQL Server表变量和临时表的区别
  • 将java类的包注册到map中_java hashmap对象当实参是出现”java:11: 错误: 无法将类 Role中的构造器 Role应用到给定类型;”?...
  • JAVA不是主方法怎么输出_java主方法如何调用非静态方法
  • php显示缩小的图片代码,php等比例缩放图片及剪切图片代码分享
  • php代码转换工具,推荐几款格式化工具以及代码转换工具
  • img标签 中的php图片大小,html中关于img标签以及改变图片尺寸的详解(图)
  • 【Leetcode】101. 对称二叉树
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • eclipse的离线汉化
  • js写一个简单的选项卡
  • Nacos系列:Nacos的Java SDK使用
  • Tornado学习笔记(1)
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 大型网站性能监测、分析与优化常见问题QA
  • 翻译:Hystrix - How To Use
  • 聊聊redis的数据结构的应用
  • 每天10道Java面试题,跟我走,offer有!
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • 数据可视化之下发图实践
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (06)Hive——正则表达式
  • (1)SpringCloud 整合Python
  • (7)STL算法之交换赋值
  • (ZT)一个美国文科博士的YardLife
  • (算法)前K大的和
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • *1 计算机基础和操作系统基础及几大协议
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET BackgroundWorker
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net MVC + EF搭建学生管理系统
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NetCore 如何动态路由
  • @GlobalLock注解作用与原理解析
  • @Query中countQuery的介绍
  • @vue/cli 3.x+引入jQuery
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [《百万宝贝》观后]To be or not to be?
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Android]如何调试Native memory crash issue
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C++]——带你学习类和对象