每日技术干货,第一时间送达
JDK17 发布已经几个月了,其中不仅包含很多新语言功能,而且与旧版 JDK 相比,性能提升也非常明显。与之前 LTS 版本的 JDK 8 和 JDK 11 相比,JDK17 的性能提升尤为明显。此次性能的提升大部分来自 JVM 的新功能和优化,在本文中我们就来重点谈一谈垃圾收集的改进。
最近,我发表过一个演讲,重点介绍了自 JDK 8 以来 G1 中的新特性,本文将在此基础之上进一步扩展,以涵盖 Parallel GC 和 ZGC取得的进步。此外,我们还有第四个受支持的收集器:Serial GC,但没有包含在此次的比较之内。Serial 是一个稳定的收集器,开销很低,但本文涉及的基准测试需要高性能的 GC 才能正常工作。
1、服务于不同的目标
有时,选择使用哪个垃圾收集器并非一目了然。重要的是需要明白,为了做出正确的选择,首先你需要搞清楚你的主要目标是什么。常见的目标包括优化吞吐量、延迟和/或资源占用情况。最佳解决方案当然是针对上述所有目标进行优化,并在每种情况下获得最佳性能。收集器力求从各个方面进行优化,但它们必须根据不同的目标做出不同的权衡。
下面,快速介绍一下不同优化的含义:
-
吞吐量:降低 GC 对可在指定时间内完成的事务总数的影响。
-
延迟:降低 GC 对单个事务的影响。
-
资源占用情况:降低GC 使用的额外资源。
不同的权衡并不意味着无法从所有方面优化收集器。在优化收集器时,很大一部分工作是确保尽可能有效地进行权衡。还有一种全面改进的好方法是,重新评估旧的设计决策,并提出更好的解决方案。另外,关注公号“终码一生”,回复关键词“资料”,获取视频教程和最新的面试资料!
2、自 JDK 8 以来的进步
自 JDK 8 以来取得的进步,我们能够看到所有收集器在各个方面都有或多或少的改进。为了更好地展示 GC 的进步,下面的比较将使用标准化分数来比较各个收集器。在此次比较中,我使用了SPECjbb® 20151,堆大小设置为16GB。这是一个众所周知且非常稳定的基准测试,它的关注点不仅限于 GC 的性能,因此结果可以展示出整个 Java 平台的进步。这个基准测试有几种不同的模式,可以同时生成吞吐量指标和延迟指标。延迟指标是衡量响应时间限制下的吞吐量。
对于暂停时间比较,我在固定负载下运行了一个小时的基准测试。也就是说,所有收集器都承担了相同级别的负载。
最后请注意, ZGC 是 JDK 11(从 JDK15 正式投入使用)中引入的,因此我们只有两个 ZGC 数据点,而 G1 和 Parallel 有三个数据点。
图片
3、吞吐量
通过以上吞吐量指标,我们可以看到与旧版本相比,所有收集器都有了明显的进步,其中 ZGC 的提升最大。在此次测试中,G1 和 Parallel 的原始吞吐量更好,但增大了堆空间后,ZGC 弥补了这一差距。另外,关注公号“终码一生”,回复关键词“资料”,获取视频教程和最新的面试资料!
当谈到这个指标时,我们应该注意,我们测量的不仅仅是 GC 的性能。Java 平台的其他部分,例如 JIT 编译器,对这些提升也有一定的帮助。
延迟
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
(https://bbs.csdn.net/topics/618164986)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!