OpenJDK 8具有几种垃圾收集器算法,例如Parallel GCCMSG1 。 哪一个最快? 如果默认的GC从Java 8中的并行GC更改为Java 9中的G1(当前建议),将会发生什么? 让我们对其进行基准测试。

基准方法

  • 使用不同的VM参数运行相同的代码6次( -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
  • 每次运行都能使用OptaPlanner解决13个计划问题。 每个计划问题要运行5分钟。 它以30秒的JVM预热开始,该预热将被丢弃。
  • 解决计划问题不涉及任何IO (启动期间要加载输入的时间只有几毫秒)。 一个CPU完全饱和。 它会不断创建许多短命的对象,然后GC会收集它们。
  • 基准衡量每毫秒可以计算的分数数量。 越高越好。 为拟议的规划解决方案计算分数并非易事:涉及许多计算,包括检查每个实体与每个其他实体之间的冲突。

要在本地重现这些基准, 请从源代码构建optaplanner并运行主类GeneralOptaPlannerBenchmarkApp 。

基准结果

执行摘要

为了方便起见,我将每种垃圾收集器类型与Java 8(并行GC)中的默认类型进行了比较。

结果很明显: 该默认值(并行GC)是最快的。

原始基准数字

相对基准数字

Java 9是否应该默认为G1?

有建议使G1在服务器的OpenJDK9中成为默认的垃圾收集器 。 我的第一反应是拒绝这个提议

  • G1平均为17.60%
  • 对于每个数据集,每个用例的G1始终较慢。
  • 在最大数据集(Machine Reassignment B10)上,它使任何其他数据集的大小都34.07% ,, G1为34.07%较慢。
  • 如果开发人员机器和服务器之间的默认GC不同,则开发人员基准测试的可信度将降低。

另一方面,需要注意一些细微差别:

  • G1专注于限制GC暂停,而不是吞吐量。 对于这些用例(计算量很大),GC暂停长度基本上无关紧要。
  • 这是(几乎)单线程基准。 在并行或多线程求解中使用多个求解器进行进一步的基准测试可能会影响结果。
  • 建议使用G1的堆大小至少为6 GB 。 该基准测试仅使用了2 GB的堆大小,甚至只有最大的数据集(Machine Reassignment B10)才需要该大小。

繁琐的计算只是OpenJDK所使用的众多功能之一:在整个社区辩论中,它只是利益相关者中的一员。 如果其他利益相关者(例如Web服务)证明相反,则值得更改默认GC。 但是,请先向我展示真实项目的基准

结论

在Java 8中,默认的垃圾收集器(Parallel GC)通常是OptaPlanner用例的最佳选择。

翻译自: https://www.javacodegeeks.com/2015/08/what-is-the-fastest-garbage-collector-in-java-8.html

Java 8中最快的垃圾收集器是什么?相关推荐

  1. java8默认垃圾收集器_Java 8中最快的垃圾收集器是什么?

    java8默认垃圾收集器 OpenJDK 8具有几种垃圾收集器算法,例如Parallel GC , CMS和G1 . 哪一个最快? 如果默认GC从Java 8中的并行GC更改为Java 9中的G1(当 ...

  2. Java性能调优:充分利用垃圾收集器

    JVM背后发生了什么,垃圾回收如何影响Java性能? 性能调优世界是一个危险的地方,一个JVM标志失衡,事情很快就会变得繁琐. 因此 ,我们决定求助于Java性能调优专家, 单调 JVM探查器mjpr ...

  3. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...

  4. java9 g1垃圾收集器_Java 9中默认为G1垃圾收集器的情况

    java9 g1垃圾收集器 在前面的几篇文章中,我已经在InfoQ上介绍并讨论了"垃圾第一垃圾收集器" -G1:一个由所有垃圾收集器来统治它们以及调整垃圾第一垃圾收集器的技巧 . ...

  5. Java垃圾回收之老年代垃圾收集器

    1.Serial Old 收集器(-XX: +UseSerialOldGC, 标记-整理算法) 单线程收集,进行垃圾收集时,必须暂停所有工作线程 简单高效,Client模式下默认的老年代收集器 2.P ...

  6. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  7. [JVM-3]Java垃圾回收(GC)机制和垃圾收集器选择

    哪些内存需要回收? 1.引用计数法 这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1:当引用失效时,计数器值-1.任何时刻计数值为0的对象就是不可能再被使用的.这 ...

  8. 《深入理解Java虚拟机第3版》垃圾收集器与内存分配策略、虚拟机性能监控故障处理工具

    目录 往期博客:Java课堂篇3_初识JMM.常量池简单理解(字符串常量池.静态常量池.大整型常量池) 为什么要了解垃圾收集和内存分配? 如何判断对象已死? 引用计数算法 可达性分析算法 JDK1.2 ...

  9. JVM中的几种垃圾收集器

    先上图,看一下HotSpot虚拟机中的垃圾收集器 图中包含了7中作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用.接下来就一一介绍. 1.Serial 收集器 这个收集器是一 ...

最新文章

  1. JavaScript基础学习3
  2. JQuery中隐式迭代和each的区别(通过反选功能解析)
  3. STM32 基础系列教程 44 - FSMC_LCD
  4. Google Hacking语法总结
  5. 基于CAD/CAM的三维控件
  6. django存入mysql数据库_django如何存数据到一个mysql数据表里面
  7. QT4.7和VS2008 顺利安装必读 (最新版)
  8. Django之数据表增删改查
  9. 一级 计算机应用基础,一级计算机应用基础(教材浓缩精华版)
  10. 【微信自动续费】委托代扣接口常见问题QA
  11. MPI中的Bcast, Reduce和Gather使用举例
  12. vue项目的导出功能
  13. python爬虫 下载视频网站视频
  14. VMwareV8.0.2 -591240 正式版及有效序列号
  15. Kali及Windows安装和使用OpenVPN
  16. 异常记录 之 nested exception is java.lang.NoClassDefFoundError: com/lowagie/text/pdf/PdfContentByte
  17. 关于flask入门教程-ajax+echarts实现热力图
  18. Integrity check failed for “antd“ (computed integrity doesn‘t match our records
  19. 说说 java包与导包
  20. 中国省份及其地级市整理JSON版(2015-08-23)

热门文章

  1. vue中如何使用vi-for限制遍历的条数?只查询前三条、查询4-6条怎么实现?
  2. Ajax实现动态及时刷新表格数据
  3. SQ小组KTV点歌系统简介
  4. 第一章数据库系统基础
  5. HTML5表格简单应用案例之[招聘需求表]
  6. java面向对象高级分层实例_实体类
  7. 云服务器的购买和宝塔面板的使用
  8. mybatis-启动源码分析
  9. eclipse发布web项目到tomcat服务器
  10. mega x_[MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)