发版说明
# 发版说明
Apusic JDK 是一款高性能、生产环境就绪的OpenJDK发行版本,完全兼容开源 OpenJDK,基于华为毕昇 JDK发展而来,支持多种运行平台,具备更快的云应用启动速度,更好的性能以及提供更为便捷的分析、诊断工具,适合微服务、云原生应用、大数据等实际应用场景,提供最优的 Java 生产环境及解决方案。此外,Apusic JDK 也是 Apusic 应用服务器的运行环境,适配大量 Java 应用程序,解决了业务实际运行中遇到的多个问题,能够为 Java 应用程序提供一个安全、稳定、可扩展、高性能的运行环境。
# 关于此版本
本次发版版本为 Apusic JDK V8.0,基于毕昇JDK1.8.0_422,完全兼容OpenJDK8.0,能够为 Java 应用程序提供一个安全、稳定、可扩展、高性能的运行环境。
# 新功能及特性增强
# 支持 JFR
JFR(Java Flight Recorder)是 Java 平台上的一款性能分析工具,它能够捕获和记录JVM运行时的各种数据,帮助开发人员分析应用程序的性能问题并优化程序性能。可通过 JVM 参数开启 : -XX:StartFlightRecording:filename=record.jfr,dumponexit=true
# AppCDS
Java 程序运行初始,类的加载是一个比较耗时的过程,且在每次程序运行中均需要执行一遍。而 CDS(Class Data Sharing)技术,把类加载后的数据保存到文件中。在下次运行时,直接将加载后的类数据从文件中恢复到内存中,不需要再重新执行类的加载过程,从而提高性能。而 AppCDS 在 CDS 的基础上,增加了对应用类的支持。
# 快速序列化
序列化是将一个对象序列化为字节流,方便进行传输和保存。OpenJDK 原生的序列化机制耗时较长,序列化的数据太大,反序列化过程查找classmeta太慢。Apusic JDK 优化序列化和反序列化的过程,加快了序列化的速度。
# Dynamic CDS特性
Dynamic CDS 技术是 OpenJDK 社区在高版本提出的用于提高Java应用内存使用效率和启动速度的新特性。Apusic JDK 支持该特性,相对于 AppCDS 而言,共享类扩展至自定义类加载器加载的类,扩展了共享类的支持范围,以带来显著的性能提升。
# G1 垃圾收集器优化
- G1 NUMA-Aware特性:在NUMA架构下,跨NUMA节点操作内存相比本NUMA节点操作内存时延会成倍增加,NUMA-Aware特性目的是让JAVA用户尽可能操作本NUMA节点上内存,从而提升JVM访存速度。
- G1 Full GC并行化:G1 算法在mark、prepare、adjust、compact等阶段优化成多线程执行方式,有效降低Full GC的STW时间,改善系统最坏情况下的G1 Full GC性能。
- G1 GC内存伸缩特性:OpenJDK 8 中 G1 垃圾收集器无法及时将空闲的 Java 堆内存释放给操作系统。G1 仅在 FullGC 才会把空闲的Java堆内存释放给操作系统。但由于 G1 尽可能避免触发 FullGC,因此在许多情况下,除非强制从外部执行 FullGC,否则 G1 不会将空闲的Java堆内存释放给操作系统。Apusic JDK 能够检测应用负载下降和Java堆有空闲内存的情况,并自动减少JVM Java堆占用情况,将空闲内存资源归还给操作系统。
# 运维工具增强
- jcmd工具新增 VM.classes 命令,打印所有类的信息。
- jcmd工具新增 VM.classloaders 命令,打印类加载器层次结构和类加载器详细信息。
- jcmd工具新增 VM.metaspace 命令,打印元空间的统计信息。
- jcmd工具新增 System.trim_native_heap 命令,底层调用glibc函数malloc_trim,将glibc不用的内存及时还给操作系统。
- Thread.print 功能增强:增强 jstack 和 jcmd Thread.print 功能,打印线程堆栈时输出更多的信息(cpu,elapsed,allocated,defined_classes)
- TraceClassLoading 功能增强:增强TraceClassLoading功能,输出更多的类加载信息(时间、线程id、类加载器以及类加载时的线程堆栈),方便用户排查类加载相关问题。
- 异步GC日志配置:解决写入GC日志可能会被阻止,进程中维护一个循环固定大小的内存缓冲区,先将GC日志写入到缓冲区,然后通过单独的线程将缓冲区的内容刷新到GC日志文件中。
- glibc内存整理:JVM 通过 glibc来进行内存的分配与释放,但是有时(取决于分配的粒度和许多其他因素)存在即使JVM调用free(3)将内存返回给glibc,glibc依然保留这些已释放的C堆内存而不是返还给操作系统,这将造成不好排查的(非JAVA/JVM层面的)RSS内存占用持续增长。
- jmap 并行扫描:可指定并行线程数,有效提高jmap堆扫描效率、减少扫描时间。
# 主要的技术变化
Apusic JDK V8.0 主完全兼容 OpenJDK8.0
# 程序缺陷修复
https://mail.openjdk.org/pipermail/jdk8u-dev/2024-July/018904.html
- CVEs
- CVE-2024-21131
- CVE-2024-21138
- CVE-2024-21140
- CVE-2024-21144
- CVE-2024-21145
- CVE-2024-21147
- Security fixes
- JDK-8314794: Improve UTF8 String supports
- JDK-8319859: Better symbol storage
- JDK-8320097: Improve Image transformations
- JDK-8320548: Improved loop handling
- JDK-8322106: Enhance Pack 200 loading
- JDK-8323231: Improve array management
- JDK-8323390: Enhance mask blit functionality
- JDK-8324559: Improve 2D image handling
- JDK-8325600: Better symbol storage
- Other changes
- JDK-8025439: [TEST BUG] [macosx] PrintServiceLookup.lookupPrintServices doesn't work properly since jdk8b105
- JDK-8069389: CompilerOracle prefix wildcarding is broken for long strings
- JDK-8159454: [TEST_BUG] javax/swing/ToolTipManager/7123767/bug7123767.java: number of checked graphics configurations should be limited
- JDK-8159690: [TESTBUG] Mark headful tests with @key headful.
- JDK-8198321: javax/swing/JEditorPane/5076514/bug5076514.java fails
- JDK-8203691: [TESTBUG] Test /runtime/containers/cgroup/PlainRead.java fails
- JDK-8205407: [windows, vs<2017] C4800 after 8203197
- JDK-8235834: IBM-943 charset encoder needs updating
- JDK-8239965: XMLEncoder/Test4625418.java fails due to "Error: Cp943 - can't read properly"
- JDK-8240756: [macos] SwingSet2:TableDemo:Printed Japanese characters were garbled
- JDK-8256152: tests fail because of ambiguous method resolution
- JDK-8258855: Two tests sun/security/krb5/auto/ReplayCacheTestProc.java and ReplayCacheTestProcWithMD5.java failed on OL8.3
- JDK-8262017: C2: assert(n != __null) failed: Bad immediate dominator info.
- JDK-8268916: Tests for AffirmTrust roots
- JDK-8278067: Make HttpURLConnection default keep alive timeout configurable
- JDK-8291226: Create Test Cases to cover scenarios for JDK-8278067
- JDK-8291637: HttpClient default keep alive timeout not followed if server sends invalid value
- JDK-8291638: Keep-Alive timeout of 0 should close connection immediately
- JDK-8293562: KeepAliveCache Blocks Threads while Closing Connections
- JDK-8303466: C2: failed: malformed control flow. Limit type made precise with MaxL/MinL
- JDK-8304074: [JMX] Add an approximation of total bytes allocated on the Java heap by the JVM
- JDK-8313081: MonitoringSupport_lock should be unconditionally initialized after 8304074
- JDK-8315020: The macro definition for LoongArch64 zero build is not accurate.
- JDK-8316138: Add GlobalSign 2 TLS root certificates
- JDK-8318410: jdk/java/lang/instrument/BootClassPath/BootClassPathTest.sh fails on Japanese Windows
- JDK-8320005: Allow loading of shared objects with .a extension on AIX
- JDK-8324185: [8u] Accept Xcode 12+ builds on macOS
- JDK-8325096: Test java/security/cert/CertPathBuilder/akiExt/AKISerialNumber.java is failing
- JDK-8325927: [8u] Backport of JDK-8170552 missed part of the test
- JDK-8326686: Bump update version of OpenJDK: 8u422
- JDK-8327440: Fix "bad source file" error during beaninfo generation
- JDK-8328809: [8u] Problem list some CA tests
- JDK-8328825: Google CAInterop test failures
- JDK-8329544: [8u] sun/security/krb5/auto/ReplayCacheTestProc.java cannot find the testlibrary
- JDK-8331791: [8u] AIX build break from JDK-8320005 backport
- JDK-8331980: [8u] Problem list CAInterop.java#certignarootca test
- JDK-8335552: [8u] JDK-8303466 backport to 8u requires 3 ::Identity signature fixes