0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

优化指南:释放Java更高性能

安晟培半导体 来源:安晟培半导体 作者:安晟培半导体 2023-06-29 18:19 次阅读

概述

在过去的十年中,Java 已经成为最流行的云编程语言之一。Hadoop、Cassandra 和 Kafka 等流行的云应用程序都使用 Java 语言和框架。Java 是一种通用的面向对象语言,被设计为 Write Once Run Anywhere,它依赖于一个 Java 虚拟机(JVM)来将字节码转换为特定应用程序所运行的体系结构的机器代码。显然,JVM 在运行时生成的代码质量对应用程序性能至关重要。

本指南描述了在 Ampere Altra 系列处理器上的 Java 支持状态,提供了一种构建 OpenJDK 的方法,并比较了不同OpenJDK 版本和二进制源代码的性能。

01Ampere Altra 系列处理器AARCH64架构支持 JAVA 吗?

OpenJDK 是官方的参考 JVM 实现。OpenJDK 是自由开源软件(FOSS),被大多数 Java 开发人员使用,并且是大多数 Linux 发行版的默认 JVM。AArch64 移植已经是 OpenJDK 项目的一部分了(见下方网址)。今天,从Java Development Kit 8 (JDK8)开始,OpenJDK 在 AArch64 上得到了很好的支持。

Ampere Altra 和 AmpereAltraMax 处理器从头开始为云而设计,为云原生应用提供可预测的性能、高可扩展性和出色的电源效率。Ampere Altra 计算核心采用 ARMv8 指令集架构(ISA),支持 AArch64 和 AArch32 指令集。目前,各种 Linux 发行版中包含的 jdk 都支持 Ampere Altra 家族处理器,但 JDK17 等较新的长期支持(LTS)版本可以提供明显更好的性能。

02从哪里可以获取 OPENJDK?

用于 Ampere Altra 系列处理器的 OpenJDK 二进制文件可以从几个来源获得。Linux 发行版通过各自的包存储库提供 OpenJDK。Adoptium 是预构建 OpenJDK AArch64 二进制文件的另一个来源。

OpenJDK 有许多发布版本,但只有表 1 中列出的版本具有 LTS 发布限定符(LTS release qualifier)。不同的 OpenJDK 发行版可能提供表1所示的生命终止日期(End of Life)。

e3f1e61a-1664-11ee-962d-dac502259ad0.png

表 1:OpenJDK LTS

03如何构建 OPENJDK?

Linux 发行版提供了不同的方式来安装 OpenJDK,例如 yum 存储库用于 RHEL 和 CentOS, apt 存储库用于 Ubuntu 或 Debian。

对于自定义构建 OpenJDK,本节列出了如何从源代码构建 OpenJDK 的推荐步骤。

在构建 OpenJDK 时建议使用 GCC。不同的 GCC 版本有不同的 AArch64 选项,如表 2 所示。

e40f608c-1664-11ee-962d-dac502259ad0.png

表 2:GCC Options

构建 OpenJDK 用到了一下配置和选项:

bash configure --with-alsa=/usr --with-alsa-lib=/usr/lib64 --with-cacerts-file=/etc/pki/java/cacerts --with-cups=/usr --with-debug-level=release --with-native-debug-symbols=none --with-extra-cflags="-pipe -fPIC -DPIC -Wl,-rpath=/usr/lib64 -L/usr/lib64 -mcpu=neoverse-n1" --with-extra-cxxflags="-pipe -fPIC -DPIC -Wl,-rpath=/usr/lib64 -L/usr/lib64 -mcpu=neoverse-n1" --with-extra-ldflags="-Wl,-rpath=/usr/lib64 -L/usr/lib64" --with-stdc++lib=dynamic --with-target-bits=64 --with-zlib=system --x-includes=/usr/include --x-libraries=/usr/lib64 --with-boot-jdk= --prefix= 
make images 
make install

04性能的影响因素

让我们来评估一些通过基本调优就可能实现的性能改进。我们在基于 Ampere Altra q80 -30 的服务器上使用 SPECjbb2015,这是一种在复合模式下流行的标准化 Java 基准测试。系统配置如表 3 所示:

e465ba68-1664-11ee-962d-dac502259ad0.png

表 3:System Configuration

评估中使用了如下的 OpenJDK 选项:

-Xms130560m -Xmx130560m -Xmn123g -XX:SurvivorRatio=39 -XX:ObjectAlignmentInBytes=32 -XX:TargetSurvivorRatio=95 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:MetaspaceSize=64m -server -XX:+AlwaysPreTouch -XX:-UseAdaptiveSizePolicy -XX:-UseCountedLoopSafepoints -XX:-UsePerfData -XX:+PrintFlagsFinal -XX:+UseTransparentHugePages -XX:+UseParallelGC -XX:ParallelGCThreads=80 -XX:AllocatePrefetchDistance=512 -XX:AllocatePrefetchLines=4 -XX:InlineSmallCode=2k -XX:TypeProfileWidth=4 -XX:SoftwarePrefetchHintDistance=128 -XX:+AvoidUnalignedAccesses -XX:BlockZeroingLowLimit=64K -XX:+UseBlockZeroing -XX:-UseSIMDForArrayEquals -XX:+UseSIMDForMemoryOps

这些是 SPECjbb 的属性:

-Dspecjbb.customerDriver.threads=64 -Dspecjbb.customerDriver.threads.service=64 -Dspecjbb.customerDriver.threads.probe=64 -Dspecjbb.customerDriver.threads.saturate=96 -Dspecjbb.forkjoin.workers=80 -Dspecjbb.forkjoin.workers.Tier1=80 -Dspecjbb.forkjoin.workers.Tier2=1 -Dspecjbb.forkjoin.workers.Tier3=16 -Dspecjbb.comm.connect.selector.runner.count=4 -Dspecjbb.controller.type=HBIR_RT -Dspecjbb.controller.port=24000 

*注*:我们的测试并不是为了达到绝对的最佳性能,而是为了研究使用不同的编译器选项和版本来提高性能。

以下是相同 OpenJDK 版本的三个源代码:

CentOS repository

Adoptium prebuilt binary

Self-built binary

使用“如何构建 OpenJDK”一节中描述的方法从 Adoptium 源代码构建自建(self-built)二进制文件。表 4 列出了用于这些二进制文件的 JDK 提供程序和 GCC 版本。

e48a6250-1664-11ee-962d-dac502259ad0.png

表 4:JDK Providers and GCC Versions

使用 SPECjbb2015 Composite Max-jOPS 作为性能指标,以 centos 提供的 JDK8 数据作为基线,图 1 显示了来自不同来源的 JDK8 和 JDK11 的性能。

e4c3af92-1664-11ee-962d-dac502259ad0.png

图 1:SPECjbb2015 JDK8 and JDK11 Performance

from Various Sources

对于特定的 OpenJDK 版本,最新的 centos 提供的二进制文件、Adoptium 二进制文件和自构建(self-built)二进制文件的性能相似,这表明 OpenJDK 社区对 AArch64 和 Ampere Altra 系列处理器的支持已经非常友好。

比较来自同一源代码(centos 提供的二进制)的不同 OpenJDK 版本,OpenJDK17 是 Ampere Altra 系列处理器上性能最好的版本。图 2 显示,从 JDK8 到 JDK11, Max-jOPS 提高了 6%,从 JDK8 到 JDK17 提高了 12%。

e4d4df9c-1664-11ee-962d-dac502259ad0.png

图 2:Performance Across OpenJDK Versions

表 4 列出并比较了不同 JDK 版本上特定于 aarch64 的 OpenJDK 选项。使用此命令可以获取这些选项:

java -XX:+PrintFlagsFinal -version

e54ae052-1664-11ee-962d-dac502259ad0.png

表 5:OpenJDK AArch64 options

因为 Ampere Altra 系列处理器功能上已经支持了原子操作和 crc32 的实现,在使用 Altra 和 Altra Max 处理器的进行性能评估时,UseLSE 和 UseCRC32 选项会自动启用。

这意味着,即使没有像“-march=armv8.2-a”或“-mcpu=neoverse-n1”这样的编译选项,OpenJDK 也可以为 Ampere Altra 系列处理器生成优化的代码。

结论

OpenJDK 是 Java 平台的自由/开源软件实现,是云计算中实际使用的 JDK。在本文中,我们看到 OpenJDK 可以无缝地移植到 Ampere Altra 系列处理器上,并且在其上有着非常出色的性能。OS 发行版和 Adoptium 提供的最新预构建( pre-built)二进制文件的性能与从源代码构建 JDK 一样。也就是说,使用最新的OpenJDK LTS 版本 17 就可以获得更高的性能。像往常一样,我们建议使用更新版本的 GCC 编译器和针对体系架构的选项从源代码构建 OpenJDK。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18288

    浏览量

    222167
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102995
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33136
  • Ampere
    +关注

    关注

    1

    文章

    54

    浏览量

    4501

原文标题:安博士讲堂 | 优化指南-释放 Java 更高性能

文章出处:【微信号:AmpereComputing,微信公众号:安晟培半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TI高性能模拟器件在大学生创新设计中的应用及选型指南

    TI高性能模拟器件在大学生创新设计中的应用及选型指南TI高性能模拟器件在大学生创新设计中的应用及选型指南TI高性能模拟器件在大学生创新设计中
    发表于 10-18 13:33

    详解java代码优化方法

    性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数44. 静态类、单例类、工厂类将它们的构造函数置为private以上是常用的Java代码优化方法,在Java
    发表于 04-02 15:43

    HBase性能优化方法总结

    读密集型对于随机读密集型工作负载,高效利用缓存和更好地索引会给HBase系统带来更高性能2. 顺序读密集型对于顺序读密集型工作负载,可以采用不使用缓存的方式减少硬盘访问次数来提高性能。3. 写密集型
    发表于 04-20 17:16

    MSP430FRx MCU如何实现更高性能

    通知。此设计利用了 FRAM 的快速写入速度和高寿命 – 但复杂程度更高。 为了真正优化系统,需要在 MSP430FR5969 MCU 上运行振动数据频谱分析,最大限度减少必须无线传输的数据。 通过利用
    发表于 09-10 11:57

    针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结 前言代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑
    发表于 06-19 21:03

    嵌入式Java虚拟机的性能优化技术

    ——JMO+(JMOplus)的性能优化技术。 在过去的几年里,Java已经在各个领域得到了广泛的应用,尤其是无线移动领域,全球180多个移动运营商已经推出了Java下载服务。无线手持
    发表于 07-18 06:26

    请问学习51、STM32以及更高性能单片机需要注意什么?

    谁能总结一下51、STM32以及更高性能单片机的学习思想,以及注意要点呢?如何能快速掌握一种单片机?有没有好的经验?
    发表于 11-06 22:10

    如何使高分辨率A/D转换器获得更高性能

    A/D转换器最常见的误差有哪些?如何使高分辨率A/D转换器获得更高性能
    发表于 04-22 06:08

    关于java性能优化的一些细节

    优化。此举能够使性能平均提高50% 。2、尽量重用对象特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成
    发表于 10-11 09:23

    AutoKernel高性能算子自动优化工具

    主要由资深HPC工程师(高性能计算优化工程师)进行开发,为了加快开发进程,缩短深度学习应用落地周期,自动化算子优化是一个趋势。AutoKernel是由OPEN AI LAB提出的高性能
    发表于 12-14 06:18

    SVE优化指南

    。 Arm 现有的高级 SIMD 指令集。 SVE 的应用包括机器学习( ML)、高性能计算(HPC)、数据分析以及可能的任何可计算约束软件。 请参看 SVE 指南的导言, 以便更完整地介绍。 SVE
    发表于 08-17 08:06

    如何在嵌入式设备上运行高性能Java

    如何在嵌入式设备上运行高性能Java
    发表于 03-28 09:43 16次下载

    STC高性能SRAM选型指南

    STC高性能SRAM选型指南 型号 容量 工作电压 温度 速度 封装
    发表于 09-24 11:33 0次下载

    JAVA优化编程

    JAVA优化编程
    发表于 03-19 11:24 1次下载

    Java编程指南

    Java编程指南
    发表于 03-19 11:26 3次下载