这篇文章正好接上前一年我们做的一次现实环境下不同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来分析里面的数据。
汇总后的结果如下。注意测试结果的单位是毫秒。
年 | Parallel | CMS | G1 |
Total GC pauses | 20 930 | 18 870 | 62 000 |
Max GC pause | 721 | 64 | 50 |
说明
首先来看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. **兼容性**:支持多种Java垃圾收集器的日志格式,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1等。 4. **自定义配置**:用户可以根据需要配置不同的视图和参数,定制化分析体验。 5. **源代码开放**:...
4. **垃圾收集**:JVM提供了多种GC算法,如Serial、ParNew、Parallel Scavenge、CMS、G1和ZGC等,它们各有优缺点,适用于不同场景。 **GC详解** 1. **GC目标**:GC的主要目标是高效地回收内存,减少停顿时间,并...
3. **垃圾收集器(Garbage Collector)**:JVM提供了多种垃圾收集器,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First)GC等。每种收集器有不同的工作策略和性能特点...
- Parallel GC:多线程版本的Serial GC,提高了吞吐量。 - CMS(Concurrent Mark Sweep)GC:并行标记,低延迟,适用于响应时间敏感的应用。 - G1(Garbage-First)GC:新一代的垃圾收集器,目标是达到可预测的...
不同的JVM版本提供了多种GC实现,例如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1 (Garbage-First) 等。G1收集器是Oracle JDK 1.8引入的一种新一代的垃圾收集器,旨在提供更可预测的暂停时间,适用于大型...
2. **垃圾收集器选择**:根据应用需求选择合适的GC策略,例如,追求高吞吐率可以选择Parallel GC,注重响应时间则可以尝试CMS或G1。 3. **监控与诊断**:使用JVisualVM、JConsole等工具进行实时监控,分析GC日志,...
Java提供了多种GC算法,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First)GC。每种算法在吞吐量、响应时间、停顿时间等方面有不同的权衡。 Serial GC适用于单CPU环境...
5. **GC策略**:支持不同的垃圾收集器策略,如Serial、Parallel、CMS、G1等。 ### 三、如何使用GCviewer 1. **下载与解压**:首先,你需要下载GCviewer的压缩包,例如gcviewer-1.35-dist-mac,解压后得到包含可...
Java提供了多种垃圾收集器,如Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)GC、G1 GC以及ZGC(Z Garbage Collector)等。每种收集器都有其适用场景和优缺点,开发者可以根据应用程序的需求选择合适的垃圾...
3. Parallel GC:并行的Full GC,适用于多CPU环境。 4. CMS GC:并发标记清除,尽可能减少暂停时间,适合响应时间敏感的应用。 5. G1 GC:新一代的垃圾收集器,目标是实现低延迟,适用于大型Java应用。 四、GC过程 ...
2. **垃圾收集器类型**:不同的JVM配置会有不同的垃圾收集器组合,如Parallel GC、CMS、G1等。GCViewer能揭示每种收集器的效率和特性。 3. **暂停时间(Pause Time)**:GC暂停是影响应用响应速度的重要因素。通过...
例如,调整新生代和老年代的比例,选择合适的垃圾收集器(如Serial GC、Parallel GC、CMS GC、G1 GC等),以及设置适当的内存大小和暂停时间目标等,都是GC调优的重要方面。 在备考GC程序员考试时,考生需要掌握...
- **CMS(Concurrent Mark Sweep)GC**:并发标记清除,减少STW时间,但可能出现浮动垃圾和内存碎片问题。 - **G1(Garbage-First)GC**:基于region的收集器,目标是预测和控制停顿时间,适用于大型应用。 - **...
这些行包含了时间戳、事件类型、内存区域(如新生代、老年代)、收集器类型(如Parallel GC、G1 GC)以及相关的统计信息。 2. **手动解析**:原始的`gclog`日志可能难以直接阅读和理解,因此开发者需要手动解析日志...
- **新生代GC算法选择**:串行GC或ParNew(并行GC的新生代版本)常用于新生代,而CMS或G1可能更适合老年代。 - **元空间**:JDK 8以后,类元数据存储在元空间而非永久代,需要合理设置元空间大小以避免溢出。 - **...
常见的GC算法有Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage-First)等。 1. Serial GC:适用于单线程环境,采用复制算法,简单但可能导致应用暂停时间较长。 2. Parallel GC:多线程版本的Serial...
6. **垃圾收集器选择**:不同的JVM版本和应用场景,适合的垃圾收集器不同,如Serial、Parallel、Parallel Old、CMS、G1、ZGC、Shenandoah等。选择合适的收集器是优化的关键。 7. **CMS(Concurrent Mark Sweep)...
Java提供了多种不同的垃圾收集器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage First)和ZGC(Z Garbage Collector)等,它们各有优缺点,适用于不同的场景。 Serial GC是最基础的单线程收集器...
1. **垃圾收集算法的理解**:CMS是如何实现并发标记和清除的,以及其与其他垃圾收集器(如Serial、Parallel、G1等)的区别。 2. **JVM内存模型**:了解Java内存分配和回收的过程,以及老年代在整个内存管理中的角色...
垃圾收集的主要类型有四种,虽然在内容中没有具体提到这四种类型,但在JVM中常见的垃圾收集器包括Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)GC和G1(Garbage-First)GC等。这些垃圾收集器有不同的特性,...