概述
在過去的十年中,Java 已經(jīng)成為最流行的云編程語言之一。Hadoop、Cassandra 和 Kafka 等流行的云應(yīng)用程序都使用 Java 語言和框架。Java 是一種通用的面向?qū)ο笳Z言,被設(shè)計(jì)為 Write Once Run Anywhere,它依賴于一個(gè) Java 虛擬機(jī)(JVM)來將字節(jié)碼轉(zhuǎn)換為特定應(yīng)用程序所運(yùn)行的體系結(jié)構(gòu)的機(jī)器代碼。顯然,JVM 在運(yùn)行時(shí)生成的代碼質(zhì)量對(duì)應(yīng)用程序性能至關(guān)重要。
本指南描述了在 Ampere Altra 系列處理器上的 Java 支持狀態(tài),提供了一種構(gòu)建 OpenJDK 的方法,并比較了不同OpenJDK 版本和二進(jìn)制源代碼的性能。
01Ampere Altra 系列處理器和AARCH64架構(gòu)支持 JAVA 嗎?
OpenJDK 是官方的參考 JVM 實(shí)現(xiàn)。OpenJDK 是自由開源軟件(FOSS),被大多數(shù) Java 開發(fā)人員使用,并且是大多數(shù) Linux 發(fā)行版的默認(rèn) JVM。AArch64 移植已經(jīng)是 OpenJDK 項(xiàng)目的一部分了(見下方網(wǎng)址)。今天,從Java Development Kit 8 (JDK8)開始,OpenJDK 在 AArch64 上得到了很好的支持。
Ampere Altra 和 AmpereAltraMax 處理器從頭開始為云而設(shè)計(jì),為云原生應(yīng)用提供可預(yù)測(cè)的性能、高可擴(kuò)展性和出色的電源效率。Ampere Altra 計(jì)算核心采用 ARMv8 指令集架構(gòu)(ISA),支持 AArch64 和 AArch32 指令集。目前,各種 Linux 發(fā)行版中包含的 jdk 都支持 Ampere Altra 家族處理器,但 JDK17 等較新的長期支持(LTS)版本可以提供明顯更好的性能。
02從哪里可以獲取 OPENJDK?
用于 Ampere Altra 系列處理器的 OpenJDK 二進(jìn)制文件可以從幾個(gè)來源獲得。Linux 發(fā)行版通過各自的包存儲(chǔ)庫提供 OpenJDK。Adoptium 是預(yù)構(gòu)建 OpenJDK AArch64 二進(jìn)制文件的另一個(gè)來源。
OpenJDK 有許多發(fā)布版本,但只有表 1 中列出的版本具有 LTS 發(fā)布限定符(LTS release qualifier)。不同的 OpenJDK 發(fā)行版可能提供表1所示的生命終止日期(End of Life)。
表 1:OpenJDK LTS
03如何構(gòu)建 OPENJDK?
Linux 發(fā)行版提供了不同的方式來安裝 OpenJDK,例如 yum 存儲(chǔ)庫用于 RHEL 和 CentOS, apt 存儲(chǔ)庫用于 Ubuntu 或 Debian。
對(duì)于自定義構(gòu)建 OpenJDK,本節(jié)列出了如何從源代碼構(gòu)建 OpenJDK 的推薦步驟。
在構(gòu)建 OpenJDK 時(shí)建議使用 GCC。不同的 GCC 版本有不同的 AArch64 選項(xiàng),如表 2 所示。
表 2:GCC Options
構(gòu)建 OpenJDK 用到了一下配置和選項(xiàng):
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性能的影響因素
讓我們來評(píng)估一些通過基本調(diào)優(yōu)就可能實(shí)現(xiàn)的性能改進(jìn)。我們?cè)诨?Ampere Altra q80 -30 的服務(wù)器上使用 SPECjbb2015,這是一種在復(fù)合模式下流行的標(biāo)準(zhǔn)化 Java 基準(zhǔn)測(cè)試。系統(tǒng)配置如表 3 所示:
表 3:System Configuration
評(píng)估中使用了如下的 OpenJDK 選項(xiàng):
-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
*注*:我們的測(cè)試并不是為了達(dá)到絕對(duì)的最佳性能,而是為了研究使用不同的編譯器選項(xiàng)和版本來提高性能。
以下是相同 OpenJDK 版本的三個(gè)源代碼:
CentOS repository
Adoptium prebuilt binary
Self-built binary
使用“如何構(gòu)建 OpenJDK”一節(jié)中描述的方法從 Adoptium 源代碼構(gòu)建自建(self-built)二進(jìn)制文件。表 4 列出了用于這些二進(jìn)制文件的 JDK 提供程序和 GCC 版本。
表 4:JDK Providers and GCC Versions
使用 SPECjbb2015 Composite Max-jOPS 作為性能指標(biāo),以 centos 提供的 JDK8 數(shù)據(jù)作為基線,圖 1 顯示了來自不同來源的 JDK8 和 JDK11 的性能。
圖 1:SPECjbb2015 JDK8 and JDK11 Performance
from Various Sources
對(duì)于特定的 OpenJDK 版本,最新的 centos 提供的二進(jìn)制文件、Adoptium 二進(jìn)制文件和自構(gòu)建(self-built)二進(jìn)制文件的性能相似,這表明 OpenJDK 社區(qū)對(duì) AArch64 和 Ampere Altra 系列處理器的支持已經(jīng)非常友好。
比較來自同一源代碼(centos 提供的二進(jìn)制)的不同 OpenJDK 版本,OpenJDK17 是 Ampere Altra 系列處理器上性能最好的版本。圖 2 顯示,從 JDK8 到 JDK11, Max-jOPS 提高了 6%,從 JDK8 到 JDK17 提高了 12%。
圖 2:Performance Across OpenJDK Versions
表 4 列出并比較了不同 JDK 版本上特定于 aarch64 的 OpenJDK 選項(xiàng)。使用此命令可以獲取這些選項(xiàng):
java -XX:+PrintFlagsFinal -version
表 5:OpenJDK AArch64 options
因?yàn)?Ampere Altra 系列處理器功能上已經(jīng)支持了原子操作和 crc32 的實(shí)現(xiàn),在使用 Altra 和 Altra Max 處理器的進(jìn)行性能評(píng)估時(shí),UseLSE 和 UseCRC32 選項(xiàng)會(huì)自動(dòng)啟用。
這意味著,即使沒有像“-march=armv8.2-a”或“-mcpu=neoverse-n1”這樣的編譯選項(xiàng),OpenJDK 也可以為 Ampere Altra 系列處理器生成優(yōu)化的代碼。
結(jié)論
OpenJDK 是 Java 平臺(tái)的自由/開源軟件實(shí)現(xiàn),是云計(jì)算中實(shí)際使用的 JDK。在本文中,我們看到 OpenJDK 可以無縫地移植到 Ampere Altra 系列處理器上,并且在其上有著非常出色的性能。OS 發(fā)行版和 Adoptium 提供的最新預(yù)構(gòu)建( pre-built)二進(jìn)制文件的性能與從源代碼構(gòu)建 JDK 一樣。也就是說,使用最新的OpenJDK LTS 版本 17 就可以獲得更高的性能。像往常一樣,我們建議使用更新版本的 GCC 編譯器和針對(duì)體系架構(gòu)的選項(xiàng)從源代碼構(gòu)建 OpenJDK。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19726瀏覽量
232752 -
Linux
+關(guān)注
關(guān)注
87文章
11416瀏覽量
212268 -
JAVA
+關(guān)注
關(guān)注
20文章
2983瀏覽量
106469 -
編程語言
+關(guān)注
關(guān)注
10文章
1952瀏覽量
35670 -
Ampere
+關(guān)注
關(guān)注
1文章
80瀏覽量
4636
原文標(biāo)題:安博士講堂 | 優(yōu)化指南-釋放 Java 更高性能
文章出處:【微信號(hào):AmpereComputing,微信公眾號(hào):安晟培半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
TI高性能模擬器件在大學(xué)生創(chuàng)新設(shè)計(jì)中的應(yīng)用及選型指南
詳解java代碼優(yōu)化方法
HBase性能優(yōu)化方法總結(jié)
MSP430FRx MCU如何實(shí)現(xiàn)更高性能
針對(duì)于Java的35 個(gè)代碼性能優(yōu)化總結(jié)
嵌入式Java虛擬機(jī)的性能優(yōu)化技術(shù)
關(guān)于java性能優(yōu)化的一些細(xì)節(jié)
AutoKernel高性能算子自動(dòng)優(yōu)化工具
大數(shù)據(jù)Java優(yōu)化
使用Arthas火焰圖工具的Java應(yīng)用性能分析和優(yōu)化經(jīng)驗(yàn)

評(píng)論