您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

美团对 Java 新一代垃圾回收器 ZGC 的探索与实践

时间:2020-08-11 12:33:26  来源:  作者:

。定位到根本原因,每个表达式都是一个类中一个方法。随着运行时间越长,执行次数增加,这些方法会被JIT优化编译进入到Code Cache中,导致CodeCache越来越大。

解决方法:JIT有一些参数配置可以调整JIT编译的条件,但对于我们的问题都不太适用。我们最终通过业务优化解决,删除不需要执行的Aviator表达式,从而避免了大量Aviator方法进入CodeCache中。

值得一提的是,我们并不是在所有这些问题都解决后才全量部署所有集群。即使开始有各种各样的毛刺,但计算后发现,有各种问题的ZGC也比之前的CMS对服务可用性影响小。所以从开始准备使用ZGC到全量部署,大概用了2周的时间。在之后的3个月时间里,我们边做业务需求,边跟进这些问题,最终逐个解决了上述问题,从而使ZGC在各个集群上达到了一个更好表现。

升级ZGC效果

延迟降低

TP(Top Percentile)是一项衡量系统延迟的指标:TP999表示99.9%请求都能被响应的最小耗时;TP99表示99%请求都能被响应的最小耗时。

在Zeus服务不同集群中,ZGC在低延迟(TP999 < 200ms)场景中收益较大:

  • TP999:下降12~142ms,下降幅度18%~74%。

  • TP99:下降5~28ms,下降幅度10%~47%。

超低延迟(TP999 < 20ms)和高延迟(TP999 > 200ms)服务收益不大,原因是这些服务的响应时间瓶颈不是GC,而是外部依赖的性能。

吞吐下降

对吞吐量优先的场景,ZGC可能并不适合。例如,Zeus某离线集群原先使用CMS,升级ZGC后,系统吞吐量明显降低。究其原因有二:第一,ZGC是单代垃圾回收器,而CMS是分代垃圾回收器。单代垃圾回收器每次处理的对象更多,更耗费CPU资源;第二,ZGC使用读屏障,读屏障操作需耗费额外的计算资源。

总结

ZGC作为下一代垃圾回收器,性能非常优秀。ZGC垃圾回收过程几乎全部是并发,实际STW停顿时间极短,不到10ms。这得益于其采用的着色指针和读屏障技术。

Zeus在升级JDK 11+ZGC中,通过将风险和问题分类,然后各个击破,最终顺利实现了升级目标,GC停顿也几乎不再影响系统可用性。

最后推荐大家升级ZGC,Zeus系统因为业务特点,遇到了较多问题,而风控其他团队在升级时都非常顺利。

参考文献

  • ZGC官网

  • 彭成寒.《新一代垃圾回收器ZGC设计与实现》. 机械工业出版社, 2019.

  • 从实际案例聊聊JAVA应用的GC优化

  • Java Hotspot G1 GC的一些关键技术

附录

如何使用新技术

在生产环境升级JDK 11,使用ZGC,大家最关心的可能不是效果怎么样,而是这个新版本用的人少,网上实践也少,靠不靠谱,稳不稳定。其次是升级成本会不会很大,万一不成功岂不是白白浪费时间。所以,在使用新技术前,首先要做的是评估收益、成本和风险。

评估收益

对于JDK这种世界关注的程序,大版本升级所引入的新技术一般已经在理论上经过验证。我们要做的事情就是确定当前系统的瓶颈是否是新版本JDK可解决的问题,切忌问题未诊断清楚就采取措施。评估完收益之后再评估成本和风险,收益过大或者过小,其他两项影响权重就会小很多。

以本文开头提到的案例为例,假设GC次数不变(10次/分钟),且单次GC时间从40ms降低10ms。通过计算,一分钟内有100/60000 = 0.17%的时间在进行GC,且期间所有请求仅停顿10ms,GC期间影响的请求数和因GC增加的延迟都有所减少。

评估成本

这里主要指升级所需要的人力成本。此项相对比较成熟,根据新技术的使用手册判断改动点。跟做其他项目区别不大,不再具体细说。

在我们的实践中,两周时间完成线上部署,达到安全稳定运行的状态。后续持续迭代3个月,根据业务场景对ZGC进行了更契合的优化适配。

评估风险

升级JDK的风险可以分为三类:

  • 兼容性风险:Java程序JAR包依赖很多,升级JDK版本后程序是否能运行起来。例如我们的服务是从JDK 7升级到JDK 11,需要解决较多JAR包不兼容的问题。

  • 功能风险:运行起来后,是否会有一些组件逻辑变更,影响现有功能的逻辑。

  • 性能风险:功能如果没有问题,性能是否稳定,能稳定的在线上运行。

经过分类后,每类风险的应对转化成了常见的测试问题,不再属于未知风险。风险是指不确定的事情,如果不确定的事情都能转化成可确定的事情,意味着风险已消除。

升级JDK 11

选择JDK 11,是因为在JDK 11中首次支持ZGC,而且JDK 11属于长期支持(Long Term Support,LTS)版本,至少会被维护三年,普通版本(如JDK 12、JDK 13和JDK 14)只有6个月的维护周期,不建议使用。

本地测试环境安装

从两个源OpenJDK和OracleJDK下载JDK 11,二个版本的JDK主要区别是长时期的免费和付费,短期内都免费。注意JDK 11版本中的ZGC不支持mac OS系统,在Mac OS系统上使用JDK 11只能用其他垃圾回收器,如G1。

生产环境安装

升级JDK 11不仅仅是升级自己项目的JDK版本,还需要编译、发布部署、运行、监控、性能内存分析工具等项目支持。美团内部的实践:

编译打包:美团发布系统支持选择JDK 11进行编译打包。

线上运行 & 全量部署:要求线上机器已安装JDK 11,有3种方式:

  1. 新申请默认安装JDK 11的虚拟机:试用JDK 11时可用这种方式;全量部署时,如果新申请机器数量过多,可能没有足够机器资源。

  2. 通过手写脚本给存量虚拟机安装JDK 11:不推荐,业务同学过多参与到运维当中。

  3. 使用容器提供的镜像部署功能,在打包镜像时安装JDK 11:推荐方式,不需要新申请资源。

监控指标:主要是GC的时间和频率,我们通过美团的CAT监控系统支持ZGC数据的收集(CAT已开源)。

性能内存分析:线上遇到性能问题时,还需要借助Profiling工具,美团的性能诊断优化平台Scalpel已支持JDK 11的性能内存分析。如果你的公司没有相关工具,推荐使用JProfier。

解决组件兼容性

我们的项目包含二十多万行代码,需要从JDK 7升级到JDK 11,依赖组件众多。虽然看起来升级会比较复杂,但实际只花了两天时间即解决了兼容性问题。具体过程如下:

1. 编译,需要修改pom文件中的build配置,根据报错作修改,主要有两类:

a. 一些类被删除:比如“sun.misc.BASE64Encoder”,找到替换类java.util.Base64即可。

b. 组件依赖版本不兼容JDK 11问题:找到对应依赖组件,搜索最新版本,一般都支持JDK 11。

2. 编译成功后,启动运行,此时仍有可能组件依赖版本问题,按照编译时的方式处理即可。

升级所修改的依赖:


 
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-parent</artifactId>
<version>6.0.16.Final</version>
</dependency>
<dependency>
<groupId>com.sankuai.inf</groupId>
<artifactId>patriot-sdk</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.39.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

JDK 11已经出来两年,常见的依赖组件都有兼容性版本。但是,如果是公司内部提供的公司级组件,可能会不兼容JDK 11,需要推动相关组件进行升级。如果对方升级较为困难,可以考虑拆分功能,将依赖这些组件的功能单独部署,继续使用低版本JDK。随着JDK 11的卓越性能被大家悉知,相信会有更多团队会用JDK 11解决GC问题,使用者越多,各个组件升级的动力也会越大。

验证功能正确性

通过完备的单测、集成和回归测试,保证功能正确性。

---------- END ----------

招聘信息

看完文章的你,如果内心燃起了想与笔者一起共事的冲动,不要犹豫,直接把简历砸过来!团队正在寻同道中人,详细岗位介绍如下,欢迎大家踊跃自荐、推荐!

资深Java工程师(风控方向)

工作城市:北京、上海

岗位职责:

1. 负责开发高并发高可用低延时的风控系统 ,对现有产品和系统进行改进和优化。从业务和技术出发,实现面向未来的系统规划、设计和落地。

2. 独立完成较复杂的系统分析、设计,并主导完成详细设计和编码的任务,确保项目的进度和质量。

3. 在团队中完成Code Review任务,确保相关代码的有效性和正确性,并能够通过Code Review提供相关性能以及稳定性的建议。

4. 技术预研和技术难点攻关,保障系统可用性、稳定性、和可扩展性。

任职要求:

1. 扎实的Java编程基础,良好的编程素养,对代码美感有追求。

2. 熟悉分布式系统和架构,对高性能、高可用架构的最佳实践以及设计原则有理解。

3. 精通微服务、一致性等分布式技术;对互联网常用技术有深入的了解,对开源产品本身有过开发经验者。

4. 对技术有激情,喜欢钻研,能快速接受和掌握新技术,有较强的独立、主动的学习能力,良好的沟通表达能力和团队协作能力。

5. 具备系统调试、性能调优等技能,对疑难技术问题具备较强的排查能力;有强烈的责任心和使命感。

6. 具备大规模、高吞吐量的系统开发实践经验。

欢迎发送简历至:sunny.fang@dianping.com。邮件主题请注明(城市-美团技术团队公众号)

 

此外,美团信息安全部更多职位持续开放中,虚位以待,就等你来!具体岗位介绍,欢迎大家点击【阅读原文】了解!
美团对 Java 新一代垃圾回收器 ZGC 的探索与实践

GIAC 全球互联网架构大会 2020 将于 8 月 14 - 15 日在深圳举行,本届 GIAC 议题共设置有 24 个专题,大会包含

技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。

高可用架构

改变互联网的构建方



Tags: Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是 tesseract + Python flask的方案实现,二是 tesseract + Sp...【详细内容】
2021-09-07  Tags: Java  点击:(81)  评论:(0)  加入收藏
java里有个神奇的存在,注解,就是那个天天@别人的家伙,它到底是何方神圣啊?请先给二当家的来个一键三连,然后接着耐心地读下去吧,多谢。什么是注解从JDK5开始,Java增加对元数据的支...【详细内容】
2021-08-13  Tags: Java  点击:(81)  评论:(0)  加入收藏
不知道各位在项目开发过程中有没有过这种体会,接手上一任的代码,看到代码的那一刻,有一种想要砸电脑的冲动,一个方法体内写了无数行代码,到处皆可看到复制粘贴的代码,变量命名也让...【详细内容】
2021-06-09  Tags: Java  点击:(147)  评论:(0)  加入收藏
前言大家好,我是正在装B学习的秃头哥。今天给大家分享一些让人直呼“哇塞”的 Java 知识总结项目,秃头哥敢说,只要看完其中任何一个,都能变大佬!事情经过昨天我妹特意从学校来家...【详细内容】
2021-06-08  Tags: Java  点击:(137)  评论:(0)  加入收藏
Java 仍是开发企业应用程序最流行的语言之一。那么,为什么无服务器serverless开发人员对它望而却步?几十年来,企业已经在各类平台上开发了关键业务应用程序,包括物理服务器、虚...【详细内容】
2021-05-27  Tags: Java  点击:(158)  评论:(0)  加入收藏
身份认证和权限鉴别,是大多数系统都需要实现的逻辑。从最简单的小型网站的用户登录,到极为庞大复杂的企业级用户权限控制,权限认证可以只是简单的判断查询,也可以是多种权限模...【详细内容】
2021-03-30  Tags: Java  点击:(739)  评论:(0)  加入收藏
2021 年了,在过去的一年 Java 软件开发行业都发生了哪些重大事件呢?这篇栈长带大家回顾一下,其实在元旦的《滚蛋吧,2020》也略有介绍,这篇就更加详细的总结一下。1、Java先说我们...【详细内容】
2021-01-05  Tags: Java  点击:(155)  评论:(0)  加入收藏
Infer【Facebook 出品】用于验证代码正确性的现代静态分析工具。Star:11.8k官网:https://github.com/facebook/infer Sourcetrail可视源代码导航器。Star:9.2k官网:https://gith...【详细内容】
2020-12-07  Tags: Java  点击:(116)  评论:(0)  加入收藏
背景身为 Java 程序员,平时少不了一些 Linux 运维工作,本文将整理本人近期用到的几个的 Linux 操作,作为网络笔记,以备后用。MySQL客户端无法连接问题新安装的MySQL数据库,使用程...【详细内容】
2020-11-23  Tags: Java  点击:(171)  评论:(0)  加入收藏
HelloGitHub 推出的《讲解开源项目》 系列。这一期是由亚马逊工程师:Keerthan Vasist,为我们讲解 DJL(完全由 Java 构建的深度学习平台)系列的第 4 篇。...【详细内容】
2020-11-03  Tags: Java  点击:(86)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条