G1 vs CMS vs平行GC

这篇文章是我们一年前进行的实验的跟进,比较了现实环境中不同GC算法的性能。 我们进行了相同的实验,将测试扩展为包含G1垃圾收集器,然后在不同的平台上运行了测试。 今年,我们的测试使用了以下垃圾收集器:

  • -XX:+ UseParallelOldGC
  • -XX:+ UseConcMarkSweepGC
  • -XX:+ UseG1GC

环境说明

实验是在现成的JIRA配置上进行的。 进行测试的动机非常明确-Minecraft,基于Dalvik的Angry Bird和Eclipse助手JIRA应该是其中最受欢迎的Java应用程序之一。 与替代方案相反,它是我们大多数人在日常业务中处理的更典型的代表–毕竟,到目前为止,服务器端Java EE应用程序中仍然使用最多的Java。

也影响了我们决定的是– Atlassian的工程师在JIRA下载中很好地打包了负载测试 。 因此,我们有一个基准可用于我们的配置。

我们仔细解压缩了最新的JIRA 6.1下载文件,并将其安装在Mac OS X Mavericks上。 并运行捆绑的测试,而不更改默认内存设置中的任何内容。 Atlassian团队非常友善,可以为我们提供服务:

-Xms256m -Xmx768m -XX:MaxPermSize=256m

测试以不同的通用方式使用JIRA功能-创建任务,分配任务,解决任务,搜索和发现任务等。测试的总运行时间为30分钟。

我们使用三种不同的垃圾收集算法进行了测试-在我们的案例中使用了Parallel,CMS和G1。 每次测试均以全新的JVM引导开始,然后将存储预填充为完全相同的状态。 只有在准备工作完成后,我们才开始生成负载。

结果

+ PrintGCTimeStamps -Xloggc:在各试验期间,我们使用-XX收集GC日志/tmp/gc.log -XX:+ PrintGCDetails和分析本次统计的帮助下GCViewer

结果可以汇总如下。 请注意,所有度量单位均为毫秒:

平行 内容管理系统 G1
总GC暂停时间 20930 18870 62 000
最大GC暂停 721 64 50

解释与结果

第一站–并行GC( -XX:+ UseParallelOldGC )。 在完成测试所需的30分钟中,我们用并行收集器在GC暂停上花费了将近21秒。 最长的暂停时间为721毫秒。 因此,让我们以此为基准:GC周期将吞吐量减少了总运行时间的1.1%最坏情况下的延迟是721ms

下一位参赛者:CMS( -XX:+ UseConcMarkSweepGC )。 同样,经过30分钟的测试,我们损失了不到19秒的GC时间。 在吞吐量方面,这与并行模式大致处于同一邻域。 另一方面,延迟得到了显着改善– 最坏情况下的延迟减少了10倍以上! 现在,GC面临的最大暂停时间仅为64毫秒

上一个实验使用了可用的最新最明亮的GC算法– G1( -XX:+ UseG1GC )。 运行了非常相同的测试,并且在吞吐量方面,我们看到结果严重受损。 这次,我们的应用程序花费了超过一分钟的时间来等待GC完成。 与CMS的仅1%的开销相比,我们现在面临的通量影响接近3.5% 。 但是,如果您真的不关心吞吐量,并且想从延迟中挤出最后一点,那么-与已经不错的CMS相比,我们提高了约20% -使用G1可以看到最长的GC暂停仅花费了50ms。

结论

与往常一样,试图将这样的实验总结为一个结论是危险的。 因此,如果您有时间和必要的技能–一定要继续测量自己的环境,而不是采用一刀切的解决方案。

但是,如果我敢于做出这样的结论,我会说CMS仍然是最好的“默认”选项。 G1吞吐量仍然差得多,以至于延迟通常不值得。


翻译自: https://www.javacodegeeks.com/2013/12/g1-vs-cms-vs-parallel-gc.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
G1GC是一种垃圾回收器,它是Java虚拟机中的一部分,用于管理内存中的垃圾对象。G1GC的全称是Garbage-First,它采用了一种独特的垃圾回收策略,可以在多线程同时工作的情况下进行垃圾回收,并且可以与应用程序交替执行,不会完全阻塞应用程序。 G1GC的主要特点包括: - 分代回收:G1GC将堆内存划分为多个区域,每个区域称为一个分代。它会根据垃圾对象的分布情况,优先回收垃圾最多的分代。 - 并发回收:G1GC可以在应用程序运行的同时进行垃圾回收,减少了停顿时间。 - 区域化回收:G1GC将堆内存划分为多个区域,每个区域都可以独立进行垃圾回收,提高了回收效率。 - 可预测的停顿时间:G1GC通过控制每次垃圾回收的时间,可以实现可预测的停顿时间,避免了长时间的停顿对应用程序性能的影响。 要在Tomcat中启用G1GC,可以按照以下步骤进行配置: 1. 打开Tomcat的启动脚本文件(如catalina.sh或catalina.bat)。 2. 在JAVA_OPTS环境变量中添加以下参数: ``` -XX:+UseG1GC -XX:MaxGCPauseMillis=<最大停顿时间> -XX:G1HeapRegionSize=<堆区域大小> ``` 其中,`<最大停顿时间>`是期望的最大停顿时间(以毫秒为单位),`<堆区域大小>`是每个堆区域的大小(以字节为单位)。 3. 保存并关闭启动脚本文件。 4. 重新启动Tomcat。 请注意,G1GC的配置参数可以根据具体的应用程序需求进行调整。建议根据实际情况进行性能测试和调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值