Java 8 最快的垃圾搜集器是什么?

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。

基准测试结果

执行结果

为了方便查看,我已经对每种 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)通常情况是最好的选择。

来源:51CTO

时间: 2024-11-15 00:31:59

Java 8 最快的垃圾搜集器是什么?的相关文章

JVM内存管理:垃圾搜集器详解

引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设计模式时使用的方式,针对某些搜集器,分几个维度去解释这些搜集器. client模式与server模式 在介绍本章内容之前,要说一下JVM的两种模式,一种是client模式,一种是server模式.我们平时开发使用的模式默认是client模式,也可以使用命令行参数-server强制开启server模式

JVM内存管理:垃圾搜集器简介

引言 上一章我们已经探讨过GC的各个算法,那么垃圾搜集器是什么呢? 通俗的讲,使用编程语言将算法实现出来,产生的程序就是垃圾搜集器了.既然谈到了编程语言的实现,那么在讨论垃圾搜集器的时候,就已经涉及到具体的虚拟机实现了. 或许有不少做JAVA开发的猿友还不知道,我们平时使用的JDK中,默认的JVM是hotspot,换句话说,我们大部分时候使用的JVM都是hotspot的实现版本,因此,本次LZ讨论垃圾搜集器都是基于hotspot版JVM来进行的,请各位猿友要知晓这一点. 更直观的,我们可以在我们

JVM内存管理:垃圾搜集器参数精解

本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器选择参数 UseSerialGC:开启此参数使用serial & serial old搜集器(client模式默认值). UseParNewGC:开启此参数使用ParNew & serial old搜集器(不推荐). UseConcMarkSweepGC:开启此参数使用ParNew & CMS(serial old为替补)搜集器. U

号称全世界最快的 JSON 解析器 , 比别的快 10x

jsoniter ( json-iterator )是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本 Jsoniter 是最快的 JSON 解析器.它最多能比普通的解析器快 10 倍之多,即使在数据绑定的用法下也有同样的性能优势.无耻地献上自己的 跑分 非常易于使用的 api ,允许你使用任何风格或者混搭的方式来解析 JSON .给你前所未有的灵活性.来看看这些 API 们是不是真的有那么好用吧 独特的 iterator api 能够直接遍历 JSON ,极致性能! 0

Java语言灵巧指针与垃圾回收

在JAVA 和 C# 中都有垃圾回收功能,程序员在分配一段内存后可以不再理会,而由垃圾回收自动回收,从而使程序员从复杂的内存管理中解脱出来.这是JAVA 和 C#的一大优点.而C++程序员在用 new 分配了一段内存后,还必须用 delete 释放,否则将造成资源泄漏.因此,一些C++ 书上经常告诫程序员:要养成好的习惯,new 与 delete 要成对出现,时刻记住将内存释放回系统.但是,事情只是这么简单吗? 经常地,在使用C++的过程中,我们会遇到下面的情形: class A { publi

快读小说阅读器怎么不能用了

  1.首先,软件出现突然不能用的情况,如果不是电脑的问题,那么就是官方出现bug了,所以大家要尽快更新快读小说最新版本 下载之前,请先卸载旧版本的快读小说阅读器,否则会出现打开错误 2.或者在旧版本软件内,点击检查更新按钮,即可弹出自动更新窗口 更新之后,重启快读小说阅读器,应该不会出现用不了的情况了!

Java线程池架构(二)多线程调度器

在前面介绍了java的多线程的基本原理信息:<Java线程池架构原理和源码解析>,本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分. 我们如果要用java默认的线程池来做调度器,一种选择就是Timer和TimerTask的结合,在以前的文章:<Timer与 TimerTask的真正原理&使用介绍>中有明确的说明:一个Timer为一个单独的线程,虽然一个Timer可以调度多个 TimerTask,但是对于一

废旧手机成增长最快电子垃圾

近日,联合国环境规划署出炉报告指出,在中国等发展中国家,今后10年内电子垃圾将急剧增长,成为环境污染的重要源头.对此有通信业专家指出,目前废旧手机已成为增长最快的电子垃圾,而国内电子垃圾处理远未产业化,散兵游勇式的电子垃圾回收亟待规范化.产业化. 手机成增长最快电子垃圾 据统计,2009年我国手机产量达到6亿部,山寨机出货量亦史无前例地达到了1.45亿部. 目前,国内用户大概一年半左右就更换一次手机.而随着3G竞争日趋白热化,运营商为推广3G业务纷纷通过预存话费送手机,入网送手机等方式鼓励用户将

[jjzhu学java]之深入理解JVM之垃圾收集器与内存分配策略

深入理解JVM之垃圾收集器与内存分配策略 如何判断对象已经消亡 引用计数算法 根搜索算法 引用 深入理解JVM之垃圾收集器与内存分配策略 java中对象的创建需要的内存都是在java堆中申请的,所以垃圾收集的区域就是对java堆和方法区的内存区域进行GC. 如何判断对象已经消亡 垃圾收集器的主要任务就是找出已经"消亡"的对象,将其标记并清除其说用内存的过程,如何判断某个对象已经"消亡",不同的虚拟机有不同的判断策略 引用计数算法 引用计数(Reference Cou