`
deepinmind
  • 浏览: 450769 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41549
社区版块
存档分类
最新评论

G1,CMS及PARALLEL GC的比较

cms 
阅读更多


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

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

###运行环境

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

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

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

{% highlight java %}
-Xms256m -Xmx768m -XX:MaxPermSize=256m
{% endhighlight %}

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

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

###结果

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

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

<table>
    <tr>
<td>年</td><td>Parallel</td><td>CMS</td><td>G1</td></tr>
"../_posts/2014-05-01-g1-vs-cms-vs-parallel-gc.markdown" 69L, 4074C written
[root@AY140109200406026f46Z _tools]# ./generate.sh
Configuration file: /root/kunka/_config.yml
            Source: /root/kunka
       Destination: /usr/share/nginx/html/
      Generating... done.
[root@AY140109200406026f46Z _tools]# ./iteye.sh
---
layout: post
title: G1,CMS及PARALLEL GC的比较
date: 2014-05-01 14:57:06
category: GC
keywords: G1,CMS,Parallel
---


这篇文章正好接上前一年我们做的一次现实环境下不同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的吞吐量实在是太差,和它所减少的那点时延相比并不划算。


原创文章转载请注明出处:http://it.deepinmind.com

英文原文链接
3
1
分享到:
评论

相关推荐

    GCViewer,Tagtraum Industries的GCviewer之叉。tagtraum在2008年停止了开发,我的目标是改进对sun/oracle的java 1.6+垃圾收集器日志(包括g1收集器)的支持。.zip

    3. **兼容性**:支持多种Java垃圾收集器的日志格式,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1等。 4. **自定义配置**:用户可以根据需要配置不同的视图和参数,定制化分析体验。 5. **源代码开放**:...

    JVM、GC详解及调优

    4. **垃圾收集**:JVM提供了多种GC算法,如Serial、ParNew、Parallel Scavenge、CMS、G1和ZGC等,它们各有优缺点,适用于不同场景。 **GC详解** 1. **GC目标**:GC的主要目标是高效地回收内存,减少停顿时间,并...

    jvm gc

    3. **垃圾收集器(Garbage Collector)**:JVM提供了多种垃圾收集器,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First)GC等。每种收集器有不同的工作策略和性能特点...

    jvm 参数及gc详解

    - Parallel GC:多线程版本的Serial GC,提高了吞吐量。 - CMS(Concurrent Mark Sweep)GC:并行标记,低延迟,适用于响应时间敏感的应用。 - G1(Garbage-First)GC:新一代的垃圾收集器,目标是达到可预测的...

    自己的系统的gc参数学习

    不同的JVM版本提供了多种GC实现,例如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1 (Garbage-First) 等。G1收集器是Oracle JDK 1.8引入的一种新一代的垃圾收集器,旨在提供更可预测的暂停时间,适用于大型...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    2. **垃圾收集器选择**:根据应用需求选择合适的GC策略,例如,追求高吞吐率可以选择Parallel GC,注重响应时间则可以尝试CMS或G1。 3. **监控与诊断**:使用JVisualVM、JConsole等工具进行实时监控,分析GC日志,...

    java gc调优

    Java提供了多种GC算法,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First)GC。每种算法在吞吐量、响应时间、停顿时间等方面有不同的权衡。 Serial GC适用于单CPU环境...

    GCviewer-1.35 GC分析工具

    5. **GC策略**:支持不同的垃圾收集器策略,如Serial、Parallel、CMS、G1等。 ### 三、如何使用GCviewer 1. **下载与解压**:首先,你需要下载GCviewer的压缩包,例如gcviewer-1.35-dist-mac,解压后得到包含可...

    gc回收机制

    Java提供了多种垃圾收集器,如Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)GC、G1 GC以及ZGC(Z Garbage Collector)等。每种收集器都有其适用场景和优缺点,开发者可以根据应用程序的需求选择合适的垃圾...

    Java GC的过程

    3. Parallel GC:并行的Full GC,适用于多CPU环境。 4. CMS GC:并发标记清除,尽可能减少暂停时间,适合响应时间敏感的应用。 5. G1 GC:新一代的垃圾收集器,目标是实现低延迟,适用于大型Java应用。 四、GC过程 ...

    gcviewer-1.29-bin.zip

    2. **垃圾收集器类型**:不同的JVM配置会有不同的垃圾收集器组合,如Parallel GC、CMS、G1等。GCViewer能揭示每种收集器的效率和特性。 3. **暂停时间(Pause Time)**:GC暂停是影响应用响应速度的重要因素。通过...

    2004-11-GC程序员考试题.rar_gc_程序员考试

    例如,调整新生代和老年代的比例,选择合适的垃圾收集器(如Serial GC、Parallel GC、CMS GC、G1 GC等),以及设置适当的内存大小和暂停时间目标等,都是GC调优的重要方面。 在备考GC程序员考试时,考生需要掌握...

    Java 内存区域和GC机制

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

    分析gclog的程序

    这些行包含了时间戳、事件类型、内存区域(如新生代、老年代)、收集器类型(如Parallel GC、G1 GC)以及相关的统计信息。 2. **手动解析**:原始的`gclog`日志可能难以直接阅读和理解,因此开发者需要手动解析日志...

    JVM调优,GC算法汇总

    - **新生代GC算法选择**:串行GC或ParNew(并行GC的新生代版本)常用于新生代,而CMS或G1可能更适合老年代。 - **元空间**:JDK 8以后,类元数据存储在元空间而非永久代,需要合理设置元空间大小以避免溢出。 - **...

    mac mat jvm gc 内存分析

    常见的GC算法有Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage-First)等。 1. Serial GC:适用于单线程环境,采用复制算法,简单但可能导致应用暂停时间较长。 2. Parallel GC:多线程版本的Serial...

    jvm-full-gc调优-jvm-full-gc.zip

    6. **垃圾收集器选择**:不同的JVM版本和应用场景,适合的垃圾收集器不同,如Serial、Parallel、Parallel Old、CMS、G1、ZGC、Shenandoah等。选择合适的收集器是优化的关键。 7. **CMS(Concurrent Mark Sweep)...

    用于测试jvm gc调优-share-jvm-gc.zip

    Java提供了多种不同的垃圾收集器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage First)和ZGC(Z Garbage Collector)等,它们各有优缺点,适用于不同的场景。 Serial GC是最基础的单线程收集器...

    cms-java-源码

    1. **垃圾收集算法的理解**:CMS是如何实现并发标记和清除的,以及其与其他垃圾收集器(如Serial、Parallel、G1等)的区别。 2. **JVM内存模型**:了解Java内存分配和回收的过程,以及老年代在整个内存管理中的角色...

    JVM Memory Model and GC.pdf

    垃圾收集的主要类型有四种,虽然在内容中没有具体提到这四种类型,但在JVM中常见的垃圾收集器包括Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)GC和G1(Garbage-First)GC等。这些垃圾收集器有不同的特性,...

Global site tag (gtag.js) - Google Analytics