这篇文章正好接上前一年咱们作的一次现实环境下不一样GC算法性能比较的试验。此次咱们仍然进行一样的试验,不过增长了对G1回收器的测试,而且在多个平台进行测试。今年咱们测试的垃圾回收器有以下几个:算法
咱们使用现成的JIRA任务来运行这个测试。选择它的缘由很是简单——除去Minecraft(一款著名网游),愤怒的小鸟,以及Eclipse不说, JIRA应该是最著名的Java应用程序了。而且和别的候选者相比,它更能表明咱们平常的业务处理流程——毕竟来讲Java用得最多的地方仍是在服务端的Java企业级应用。性能
影响咱们决定的还有一个因素—— Atlassian的工程师们发布了一个打包好的JIRA压测脚本 。咱们能够直接用它来进行咱们的基准测试。测试
咱们仔细的将最新版的JIRA6.1解压,而后把它安装到Mac OS X Mavericks上。最后直接使用默认的内存参数设置来运行这个测试程序。Atlassian团队的家伙已经帮咱们把参数也设置好了:spa
-Xms256m -Xmx768m -XX:MaxPermSize=256m
这个程序使用了JIRA的常见的几种不一样功能——建立任务,分配任务,解析任务,查找及发现任务,等等。总的运行时间是30分钟。日志
咱们使用了三种不一样的GC算法来运行这个测试——Parallel,CMS, 和G1。每次测试都从新启动一个新的JVM实例,并事先把存储恢复到一样的状态。一切准备就绪后咱们才开始启动压测。code
每次测试咱们都经过-XX:+PrintGCTimeStamps -Xloggc:/tmp/gc.log -XX:+PrintGCDetails来收集GC日志,最后使用GCViewer来分析里面的数据。ip
汇总后的结果以下。注意测试结果的单位是毫秒。内存
年 | 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毫秒。get
下一个:CMS(-XX:+UseConcMarkSweepGC)。在30分钟的测试中,因为GC而损失的时间是19秒。吞吐量和上一次的并行模式下的差很少。不过期延方面有了明显的改善——最坏的状况下的时延减小了10倍!如今最大的GC暂停时间只有64毫秒。table
最后一次测试用的是最新最潮的GC算法——GC(-XX:+UseG1GC)。运行的是一样的测试程序,不过结果的吞吐量则严重降低了。此次测试应用在GC上花费的时间超过了一分钟。和CMS只有1%的开销相比,此次的吞吐量降低了有3.5%。不过若是你不在意吞吐量而更在意时延的话——这方面它和前面表现最好的CMS相比还有20%的提高——G1回收器最长的暂停时间只有50ms。
想经过这么一次试验来得出一个结论是很是危险的。若是你的时间充足又有相应的能力的话——你应该在本身的环境中具体状况具体分析,而不是使用一刀切的方法。
不过若是说非要得出一个结论,我认为说CMS仍然是最佳的默认选择。G1的吞吐量实在是太差,和它所减小的那点时延相比并不划算。