专栏首页LINUX阅码场相同版本 JVM 和 Java 应用,在 x86 和AArch64 平台性能相差30%,何故?

相同版本 JVM 和 Java 应用,在 x86 和AArch64 平台性能相差30%,何故?

编者按:目前许多公司同时使用 x86 和 AArch64 2 种主流的服务器。这两种环境的算力相当,内存相同的情况下:相同版本的 JVM 和 Java 应用,相同的 JVM 参数,应用性能在不同的平台中表现相差 30%,x86 远好于 AArch64 平台。本文分析了一个应用在 AArch64 平台上性能下降的例子,发现 JVM 的 CodeCache 大小是引起这个性能问题的根源,进而研究什么导致了不同平台上 CodeCache 大小的不同。最后笔者给出了不同平台中该如何设置参数规避该问题。希望本文能给读者一些启示:当使用不同的硬件平台时需要关注底层硬件对于上层应用的影响。

业务在 x86 和 AArch64 上同时部署时(相同的 JDK 和 Java 应用版本),发现 AArch64 平台性能下降严重问题。进一步查看日志,发现在 AArch64 平台中偶有如下情况:

这代表 JVM 中的 CodeCache 满了,导致编译停止,未编译的方法只能解释执行,进而严重影响应用性能。那什么是 CodeCache

CodeCache 是什么

简单来说,CodeCache 用于存放编译后的方法,主要分为三部分:

  1. Non-nmethods:包括运行时 Stub,Adapter 等;
  2. Profiled nmethod:包括会采集信息的方法,即分层编译中第 2、3 层的方法;
  3. Non-Profiled nmethods:包括不采集信息的方法,即分层编译中第 1、4 层的方法,也包括 JNI 的方法。

注:分层编译指的是 JVM 同时存在 C1 和 C2 两种编译器,C1 做一些简单的编译优化,耗时较短,C2 做更多复杂的编译优化,性能较好,编译耗时较多。分层编译的触发在 JVM 内会根据相应的条件进行触发,关于更多分层编译相关知识可以参考相关资料 [1]。

在 JDK 9 之后 [2],这些会分配到不同的区域(使用不同区域的优点:查找、回收等),JDK 8 中会分配到同一块区域。

JVM 平时会清理一些不可达的方法,例如由于退优化等产生的死方法,另外 UseCodeCacheFlushing 选项(默认开启),还会清理较老以及执行较少的方法。一旦 CodeCache 满了之后,会停止编译,直到 CodeCache 有空间,若关闭了 UseCodeCacheFlushing 选项,则会直接永久停止编译。

不同的 JVM 版本以及不同的参数,默认的 CodeCache 大小不同。JDK 11 中默认参数下 CodeCache 大小为 240M,若想获取(确认)默认情况下的 CodeCache 大小,建议使用 - XX:+PrintFlagsFinal 选项获取 ReservedCodeCache 的大小。

CodeCache 大小主要通过以下选项调节:

Option

Description

InitialCodeCacheSize

初始的 CodeCache 大小(单位字节)

ReservedCodeCacheSize

预留的 CodeCache 大小,即最大CodeCache 大小(单位字节)

CodeCacheExpansionSize

CodeCache 每次扩展大小(单位字节)

使用–XX:+PrintCodeCache 选项可以打印应用使用的 CodeCache 情况,如下:

其中 max_used 表示应用中使用到的 CodeCache 大小,据此可以设置合适的 ReservedCodeCacheSize 值。

AArch64 vs x86_64

我们都知道 AArch64 和 x86 分别为 RISC 和 CISC 架构,因此代码密度方面存在一定差异,在这篇文章 [3] 中比较了不同指令集下手写汇编的大小,可以看到 AArch64 的代码密度是 RISC 架构中较优的,但相比 x86_64 仍稍差些(其中 RISC 最差,m68k 最好)。

另外笔者选用业界通用的 java 测试套 dacapo[4] 比较 AArch64 和 x86_64 下 CodeCache 占用的大小。

可以看到,在 AArch64 架构下,CodeCache 均比 x86_64 要大,但根据不同场景,大小差距不同,在 5%-20% 之间。因此在我们发现相同应用在 x86 和 AArch64 上时,CodeCache 大小需要进行相应的调节。

除此之外,还需要注意 InlineSmallCode 选项,JVM 只会 inline 代码体积比该值小的方法。JVM 通过 inline 可以触发更多的优化,因此 inline 对于性能提升也很重要。在 JDK 11 中,InlineSmallCode 在 x86 下的默认值为 2000 字节,在 AArch64 下的默认值为 2500 字节。而 JDK 8 中,InlineSmallCode 在 x86 和 AArch64 下默认值均为 2000 字节。因此建议迁移时也相应修改 InlineSmallCode 的值。业务通过对 CodeCache 相关参数的调整,达到助力 JIT 的最佳编译效果。

后记

如果遇到相关技术问题(包括不限于毕昇 JDK),可以进入毕昇 JDK 社区查找相关资源(点击原文进入官网),包括二进制下载、代码仓库、使用教学、安装、学习资料等。毕昇 JDK 社区每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM、JDK 和 V8 等相关编译技术,感兴趣的同学可以添加如下微信小助手,回复 Compiler 入群。

参考

[1]http://cr.openjdk.java.net/~thartmann/talks/2017-hotspot_under_the_hood.pdf

[2]https://bugs.openjdk.java.net/browse/jdk-8015774

[3]http://web.eece.maine.edu/~vweaver/papers/iccd09/ll_document.pdf

[4]http://dacapobench.org/

本文分享自微信公众号 - Linux阅码场(LinuxDev)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Tencent JDK 国产化CPU架构支持分享

    导语 GIAC(全称:GLOBAL INTERNET ARCHITECTURE CONFERENCE)是长期关注互联网技术与架构的高可用架构技术社区和msup...

    腾讯大数据
  • Tencent JDK 国产化CPU架构支持分享

    ? GIAC(GLOBAL INTERNET ARCHITECTURE CONFERENCE)是长期关注互联网技术与架构的高可用架构技术社区和msup推出的,...

    腾讯技术工程官方号
  • KonaJDK – 赋能腾讯云上Java生态

    导语:JDK作为Java应用的基础设施,在云Java生态上的重要性不言而喻。KonaJDK作为Tencent自研JDK, 已经平稳支撑于腾讯云微服务,消息中间...

    腾讯大数据
  • KonaJDK赋能云上Java新生态

    导语:本文将主要从KonaJDK在信创云环境支撑,KonaJDK支持腾讯云产品的能力拓展与定制化以及KonaJDK在大数据场景的优化实践几个方面,介绍KonaJ...

    腾讯云中间件团队
  • 一次搞定 Arm Linux 交叉编译

    交叉编译其实是相对于本地编译(native build)来说的,我相信大家最开始学习 C/C++ 这些语言的时候,都是在电脑上写程序,然后在电脑上编译生成可执行...

    HackforFun
  • 用苹果M1电脑,打任天堂明星大乱斗,是一种怎样的体验?

    他们分别测试了《任天堂明星大乱斗》、《塞尔达传说:天空之剑》和《星际大战:侠盗中队2》几款游戏的运行效果。

    量子位
  • 基于ARM的AWS EC2实例上的PG跑起来性能怎么样?

    ARM处理器在数据中心中的应用一直是一个热门话题,我们很想看看他在PG中表现怎么样。用于测试和评估基于ARM的服务器,其可用性一直是一个主要障碍,当AWS 20...

    yzsDBA
  • Android 中arm64-v8a、armeabi-v7a、armeabi、x86简介~

    LZ是一名96年Android小生,从14年9月培训出来到现在,差不多俩年多的时间,由于一些原因,没能好好把技术提升一下,实乃不该啊。

    HLQ_Struggle
  • 创建 Vitis 加速平台第 2 部分:在 PetaLinux 中为加速平台创建软件工程

    这是《创建 Vitis 加速平台》系列的第 2 篇博文。在前文中,我们讲解了如何创建硬件以及如何通过 XSA 将元数据 (metadata) 传递给 Vitis...

    碎碎思
  • Java 12 / JDK 12 正式发布,看看有哪些新特性

    JDK 12 于 美国当地 2019年3月19日发布 .GPL下的生产就绪的jar 可从Oracle下载 ; 其他供应商的JAR 包 很快就会出现。

    开发者技术前线
  • Java 12 / JDK 12 正式发布

    自 2 月 7 日开始,Java 12 / JDK 12 就进入了 RC 阶段。按照发布周期,美国当地时间 3 月 19 日,也就是今天——Java 12 正式...

    纯洁的微笑
  • Java 12 新特性概述

    Java 12 已如期于 3 月 19 日正式发布,此次更新是 Java 11 这一长期支持版本发布之后的一次常规更新,截至目前,Java 半年为发布周期,并且...

    beifengtz
  • sigar进行JAVA后台系统资源监控错误:java.lang.UnsatisfiedLinkError

    Windows系统下载这三个文件:sigar-amd64-winnt.dll、sigar-x86-winnt.dll、sigar-x86-winnt.lib。放...

    浩Coding
  • 腾讯蝉联JDK17贡献国内第一,自研Kona JDK两大新版本正式开源

    ? 导读 / Introduction 2021年9月14日,Oracle 正式对外发布新的长期支持版本JDK17。据Oracle官方公告,腾讯Kona JD...

    腾讯大数据
  • Java JDK 11:现在可以使用所有新功能

    Java Development Kit(JDK)11现已普遍可用,可供生产使用,提高了工作效率,并提供了实现HTTP / 2的HTTP客户端API。

    gemron的空间
  • 分布式数据库在 ARM 平台探索之路(一) TiDB 集群在 arm 平台编译安装与部署

    原文链接:https://mp.weixin.qq.com/s/voEr3WId1LeOr-o4sFptPA?scene=25#wechat_redirect

    PingCAP
  • JVM-执行引擎

    JVM设计者们的初衷仅仅只是单纯地为了==满足Java程序实现跨平台特性==,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐...

    开源君
  • Java各版本特性一览-从Java1.0到Java12

    初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢。

    老九学堂-小师弟
  • 【JVM系统学习之路系列】 JVM 概述篇

    大家好,我是小春哥,前面我用了10多个章节对并发编程 JUC 相关知识进行梳理,如果对 JUC知识还不了解的同学,关注我的公众号【山间木匠】从菜单底部可直达,从...

    山间木匠

扫码关注云+社区

领取腾讯云代金券