OpenJDK 8 有多种 GC(Garbage Collector)算法,如 Parallel GC、CMS 和 G1。哪一个才是最快的呢?如果在 Java 9 中将 Java 8 默认的 GC 从 Parallel GC 改为 G1 (目前只是建议)将会怎么样呢?让我们对此进行基准测试。


基准测试方法


运行相同的代码六次,每次使用不同的VM参数(-XX:+UseSerialGC, -XX:+UseParallelGC, -XX:+UseConcMarkSweepGC, -XX:ParallelCMSThreads=2, -XX:ParallelCMSThreads=4, -XX:+UseG1GC)。


每次运行大概花费55分钟。


其它VM参数:-Xmx2048M -server


OpenJDK版本:1.8.0_51(当前最新的版本)


软件:Linux version 4.0.4-301.fc22.x86_64


硬件:Intel? Core? i7-4790 CPU @ 3.60GHz


每次运行13个?OptaPlanner?规划问题方案。每次运行时间为5分钟。前30秒用于JVM预热,不计算在内。


解决规划问题不涉及 IO (除了启动时需要几毫秒来加载输入信息)。单个 CPU 使用完全饱和。通常会创建许多存活时间很短的对象,GC 之后就会回收这些对象。


衡量标准可以是计算每毫秒的得分,越高越好。计算一个拟议规划解决方案是一个不可小觑的问题:涉及到大量的计算,包括每个实体与其他所有实体的冲突检测。


为了能在本地重复运行这些基准测试,可以从源码进行构建,然后运行主类 GeneralOptaPlannerBenchmarkApp。


源码

http://www.optaplanner.org/code/sourceCode.html


基准测试结果


执行结果


为了方便查看,我已经对每种 GC 与 Java 8 默认 GC(Parallel GC)进行了比较。


图片


结果非常清楚:默认(Parallel GC)是最快的。


原始基准测试数据


图片


相对基准测试数据


图片


Java 9 默认应该为 G1 吗?


有一种提议是在 OpenJDK9 的服务器端使用 G1 作为默认 GC。我第一反应就是拒绝该提议:


G1 的平均值要慢17.60%


G1 在每个数据集用例下都比较慢。


在最大数据集(Machine Reassignment B10)下,表现比其它数据集都要差,G1 慢了34.07%。


如果在开发机和服务器之间采用不同的默认 GC,则开发者基准测试的可信度就会下降。


另一方面,存在几个需要注意的细节:


G1 关注是 GC 暂停的问题,而不是吞吐量。对于这些用例(计算量比较大),GC 暂停时长基本没影响。


这是一个(基本是)单线程的基准测试。并行解决多个问题或采用多线程解决的基准测试,结果可能不同。


G1 推荐的堆内存至少是 6GB。而这次基准测试的堆内存是 2GB,即使在最大数据集(Machine Reassignment B10)也只需要这么多内存。


海量计算只是 OpenJDK 的诸多功能中的一个:这是在社区广泛争论的一个问题。如果有其他方面(如网站服务)的证明,可能值得改变默认GC。但是,请首先向我展示你实际项目的基准测试。


结论


在 Java 8 中,对 OptaPlanner 用例来说,默认 GC(Parallel GC)通常情况是最好的选择。


更多相关文章

  1. 测试领域,小白问题大集合(适合未入门和入门初级者)
  2. Swagger 自动生成 Dubbo 服务的接口文档,以及测试调用
  3. Linux性能优化(八)——网络测试工具
  4. 用 cURL 请求测试 ETag 浏览器缓存[每日前端夜话0xCC]
  5. Linux性能优化(十三)——CPU性能测试
  6. 如何在angularjs代码中单元测试jquery元素
  7. js去除html标记的测试问题。很多分!
  8. 这是一个关于HTML编辑器的功能测试
  9. android json php测试输出垃圾

随机推荐

  1. android导入工程报错
  2. Android tab 学习
  3. Android——RatingBar(评价条)相关知识总结
  4. sensor
  5. Android选项卡TabHost方式实现
  6. android ActionBar(官方指导)
  7. (原)Eclipse的java中文件读写
  8. ListView小知识整理:滑动背景、Item间隙等
  9. Android学习笔记6——基本布局
  10. ContentProvider详解