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

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

3天内不再提示

毕昇JDK 8 Dynamic CDS特性介绍

openEuler 来源:毕昇编译 作者:守兵、张一鹏 2022-12-05 11:52 次阅读

1 背景

JDK 5 中引入的 Class-Data Sharing (CDS) 技术允许将一组类预处理为共享存档文件,然后可以在运行时进行内存映射以减少启动时间。当多个 JVM 共享同一个归档文件时,它还可以减少内存占用。

在 OpenJDK 社区,CDS 技术发展有两个演进方向:

扩大archive的类的范围:CDS -> AppCDS -> Dynamic CDS。

扩大archive的数据种类:metadata(CDS、AppCDS、Dynamic AppCDS) -> 基本类对象 -> strings -> module -> Support for pre-generated java.lang.invoke classes in CDS archive。

Dynamic CDS特性(JEP 350: Dynamic CDS Archives[1])主要功能:

继续增加类共享的范围,提升共享类技术的收益

简化使用 AppCDS 时 dump classlist 的操作,直接在程序退出时 dump 内存中的类到 JSA 文件。

毕昇JDK 8 中实现的 Dynamic CDS 特性相比之前的 AppCDS ,增加了 Custom ClassLoader 的支持,扩展了共享类的支持范围;且该JDK版本带有基本类的 base JSA 文件,可以消除 dump classlist 的步骤,提高该特性的易用性。经测试,在使用此特性的情况下 SpringBoot 启动时间具有显著提升。

注:JEP 350 中 Dynamic CDS 增加支持的类(lambda、匿名类),毕昇JDK 8 暂时没有实现。

2 特性介绍

Java 应用程序使用base JSA运行,在程序执行结束时对类进行动态归档生成top JSA,top JSA将包含base JSA以外所有可以共享的类(包含Custom ClassLoader加载的类),共享类范围的扩大提供了更短的启动时间,而且Dynamic CDS对于额外共享的类采用重定位(relocate)到一个更加紧凑的内存空间以减少空间的浪费。

base JSA:使用CDS/AppCDS生成的类共享文件,当不指定其路径时,默认为:$JAVA_HOME/jre/lib//server/classes.jsa。
top JSA:使用Dynamic CDS生成的类共享文件。

a5f1887c-723e-11ed-8abf-dac502259ad0.png

注:类数据区分为读写、只读,分别放置在RW、RO区。

此特性可以使用default JSA(JDK包中自带的基本类的JSA文件)作为base JSA,因此可以简化CDS特性使用步骤,生成top JSA后,运行程序时则同时将base JSA、top JSA映射到内存中以加速启动和节省内存。

a6174b98-723e-11ed-8abf-dac502259ad0.png

此特性为保证Customer ClassLoader加载类的正确性,与AppClassLoader、ExtClassLoader在FindLoadedClass时直接由classLoader来查找共享类不同,其在DefineClass中的基本校验完毕后查询共享类。

3 使用说明

3.1 相关参数说明

分类 选项 含义
运行时选项 -Xshare:on 该参数继承 CDS,使用共享文件
-XX:+UnlockExperimentalVMOptions 开启实验特性
-XX:SharedArchiveFile 用于用户首次启动时指定 base JSA 文件,其是生成 top JSA 的基础
-XX:ArchiveClassesAtExit 用户指定进程退出时生成 top JSA 文件路径。文件名支持按照进程号 %p 输出,可避免多JVM进程复写一份 top JSA,导致 top JSA 不可用
日志开关 -XX:InfoDynamicCDS 打开级别为 info 的日志,可以通过 -XX:DynamicCDSLog=PATH 设置输出路径,默认为标准输出流
-XX:DebugDynamicCDS 打开级别为 debug 的日志,其余同上
-XX:TraceDynamicCDS 打开级别为 trace 的日志,其余同上

3.2 使用步骤

分为两个步骤:

将可共享类的元数据(MetaData)dump 进文件;

使用该文件执行 Java 程序。

下面以 HelloWorld 程序为例简单说明 Dynamic CDS 的用法。

预置条件:Java 程序 HelloWorld.class。

下面是每个步骤的命令行,相关参数说明请参见 JVM 参数说明。

步骤一:生成 top JSA(依赖 base JSA ),实验特性开关需要使能

java-XX:+UnlockExperimentalVMOptions-Xshare:on-XX:ArchiveClassesAtExit=top.jsa-XX:+InfoDynamicCDSHelloWorld

如果因为某些参数改变,导致 JDK 包中带的 default JSA 无法使用,请重新用 CDS/AppCDS 生成 base JSA。

非正常结束的进程,比如 kill -9 杀死进程,则无法生成 JSA,则需要通过 jcmd GC.dynamic_cds_dump 命令在进程结束之前生成。

可省略 -XX:SharedArchiveFile 参数,此时默认使用 -XX:SharedArchiveFile=$JAVA_HOME/jre/lib//server/classes.jsa 文件。

因为生成 JSA 过程中会修改运行时数据,无法保证运行时正确,因此 dump top JSA 结束后直接退出进程。

步骤二:使用 top JSA 运行 Java 程序

java-XX:+UnlockExperimentalVMOptions-Xshare:on-XX:ArchiveClassesAtExit=top.jsa-XX:+InfoDynamicCDSHelloWorld

top JSA 中记录了 base JSA 的路径,可以在参数中只指明 top JSA 。如果 base JSA 路径在 top JSA 生成之后发生了改变,需要同时指明 base、top JSA 的路径:

java-Xshare:on-XX:SharedArchiveFile=base.jsa:top.jsa-XX:+InfoDynamicCDSHelloWorld

3.3 使用限制

生成、使用JSA两阶段参数和环境PAGE_SIZE必须一致

restore阶段使用参数 -XX:ObjectAlignmentInBytes=32、16 时,运行时会报错,信息如下:

ErroroccurredduringinitializationofVM
Unabletousesharedarchive.
Anerrorhasoccurredwhileprocessingthesharedarchivefile.
Thesharedarchivefile'sObjectAlignmentInBytesof8doesnotequalthecurrentObjectAlignmentInBytesof32.

错误原因:因为生成 base JSA 时,ObjectAlignmentInBytes 默认为8,读取时不支持指定其他对齐参数。

解决方法:重新使用 CDS/AppCDS 生成 base JSA 使用,生成时参数加入使用时对应的 -XX:ObjectAlignmentInBytes 的值即可。

当dump时的系统环境变量pagesize小于使用时的pagesize,运行时会报错,信息如下:

Anerrorhasoccurredwhileprocessingthesharedarchivefile.
UnabletomapReadOnlysharedspaceatrequiredaddress.
ErroroccurredduringinitializationofVM
Unabletousesharedarchive.

错误原因:page_size 影响 JSA 文件中的数据对齐,系统无法为JSA文件恢复分配内存。

解决方法:重新使用 CDS/AppCDS 在当前环境生成 JSA 使用即可。

不支持关闭压缩指针

使用 CDS(restore)阶段使用参数 -XX:-UseCompressedOops 或 -XX:-UseCompressedClassPointers 时,运行时会报错,信息如下:

ErroroccurredduringinitializationofVM
Unabletousesharedarchive.:UseCompressedOopsandUseCompressedClassPointersmustbeonforUseSharedSpaces.
Classdatasharingisinconsistentwithotherspecifiedoptions.

错误原因:目前 CDS 只支持压缩指针场景。

解决方法:使用时应当开启压缩指针开关,后续会支持压缩指针关闭场景。

最大堆地址值需小于32G(当使用默认参数 -XX:ObjectAlignmentInBytes=8)

使用 CDS(restore)阶段使用参数和 (值 )的组合,运行时会报错,信息如下:

Anerrorhasoccurredwhileprocessingthesharedarchivefile.
Unabletoreservesharedspaceatrequiredaddress0x0000000800000000
ErroroccurredduringinitializationofVM
Unabletousesharedarchive.

错误原因:JSA 文件的映射地址的堆区间,不能被参数所指定的JVM 其他组件占用。

解决方法:将此组合值 改为小于 32 可正常运行。

Dynamic CDS 不支持的共享类

Java version1.5 以及之前的类不支持共享。

JVM anonymous class 不支持共享。

如果基类不支持共享,则该类也不支持共享。

Dynamic CDS 不支持 JFR

JFR组件启动过程会通过 asm 动态创建匿名类(anonymous class),与 Dynamic CDS 冲突。

4 性能测试

SpringBoot场景测试结果:

a627be88-723e-11ed-8abf-dac502259ad0.png

测试说明:

经测试,使能 Dynamic CDS 特性相比于默认参数 java -jar spring-petclinic-2.5.0-SNAPSHOT.jar 启动效率会提升14.3%。

5 特性演进

后续毕昇JDK8 CDS特性将支持压缩指针关闭场景。

审核编辑:汤梓红

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

    关注

    0

    文章

    5

    浏览量

    7522
  • JDK
    JDK
    +关注

    关注

    0

    文章

    80

    浏览量

    16567
  • cds
    cds
    +关注

    关注

    0

    文章

    13

    浏览量

    14397

原文标题:毕昇JDK 8 Dynamic CDS 特性介绍

文章出处:【微信号:openEulercommunity,微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于杯,求助

    大二电子新手 ,有意向参加明年4月的杯竞赛,不知道该做些什么作品,我会的也不多,没什么好想法,各位好心人谁来给点提议啊 我现在在学习单片机和一些常用软件:multisim,altium ,什么的 请问还应该学习什么必要的知识呢?》多谢了
    发表于 11-15 22:21

    关于杯参赛选题

    本人研一,现在想和同学一起参加杯,可是不知道选什么题目,有高人给点建议吧
    发表于 12-04 17:10

    JDK 15安装步骤及新特性

    。  JDK 15 新特性说明  JDK 15 为用户提供了14项主要的增强/更改,包括一个孵化器模块,三个预览功能,两个不推荐使用的功能以及两个删除功能。  1. EdDSA 数字签名算法  新加入
    发表于 12-23 17:36

    JDK 8 Dynamic CDS 特性介绍

    Dynamic CDS 增加支持的类(lambda、匿名类),JDK 8 暂时没有实现
    发表于 12-23 16:19

    IBM Informix Dynamic Server入门指

    IBM Informix Dynamic Server入门指南的主要内容:介绍第1章 介绍Dynamic Server与Cllent产品第2章 使用
    发表于 08-01 15:36 14次下载

    什么是cds?CDS是什么意思?

    什么是cds?CDS是什么意思? CDS是相关双取样电路(Correlated Double Sampling), CCD传感器的每个像素的输出波形只在一部分时间内是图像信号,
    发表于 09-02 11:35 5.6w次阅读

    如何解决JDK8小版本升级后性能下降的问题

    编者按:在升级 JDK8U 的小版本后(从 8u74 升级到 8u202),遇到性能剧烈下降的问题(性能下降 13 倍)。该应用是一个非常简单的 Web 应用,且应用在 JDK 升级前
    的头像 发表于 07-26 14:44 4019次阅读
    如何解决<b class='flag-5'>JDK8</b>小版本升级后性能下降的问题

    JDK8JDK11首次同时发布两个版本

    2021 年 9 月 30 日, JDK update Q3 版本正式发布,本次发布将包含 X86_64 版本。此前,
    的头像 发表于 10-28 10:53 3227次阅读
    <b class='flag-5'>毕</b><b class='flag-5'>昇</b><b class='flag-5'>JDK8</b>和<b class='flag-5'>JDK</b>11首次同时发布两个版本

    Fortran编译器内联动态库函数str_copy

    Fortran编译器是一款基于classic flang的高性能Fortran编译器,支持Fortran编程语言的编译和运行,提供强大的数值计算和数据处理能力,在科学计算领域应用前景广阔。
    的头像 发表于 09-21 11:35 1096次阅读

    人工智能等领域涌现出多样的异构算力

    在开场致辞中提到,编译器、JDK等产品为开发者提供全栈解决方案,实现性能竞争力领先,释放鲲鹏、
    的头像 发表于 09-28 09:50 849次阅读

    JDK11升级JDK17最全实践

    2021年9月14日,Oracle发布了可以长期支持的JDK17版本,那么从JDK11到JDK17,到底带来了哪些特性呢?亚毫秒级的ZGC效果到底怎么样呢?值得我们升级吗?而且升级过程
    的头像 发表于 11-17 10:36 1436次阅读
    <b class='flag-5'>JDK</b>11升级<b class='flag-5'>JDK</b>17最全实践

    weblogic修改jdk路径

    )路径的情况。本文将详细介绍如何在WebLogic中修改JDK路径。 一、背景介绍 Java Development Kit(JDK)是Java开发人员必备的工具包,用于编译、运行和调
    的头像 发表于 12-05 14:46 1209次阅读

    大模型应用开发平台+浪潮信息AIStation,让大模型定制更简单

    北京2024年6月5日 /美通社/ -- 近日,大模型应用开发平台与浪潮信息AIStation智能业务生产创新平台完成兼容性互认证。基于和浪潮信息AIStation,用户通过预
    的头像 发表于 06-05 11:58 372次阅读
    <b class='flag-5'>毕</b><b class='flag-5'>昇</b>大模型应用开发平台+浪潮信息AIStation,让大模型定制更简单

    JDK11升级JDK17最全实践干货来了

    1、前言 如果你仍在使用JDK8,那你是否曾经遇到过OutOfMemoryError的问题?你是否曾经为JVM的调优问题感到困扰?本篇文章将为你介绍一种能够提供百倍性能提升的垃圾回收器,也许能够
    的头像 发表于 06-25 14:50 645次阅读
    <b class='flag-5'>JDK</b>11升级<b class='flag-5'>JDK</b>17最全实践干货来了

    JDK8升级JDK11最全实践干货来了

    1、前言 截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本。那么从JDK8JDK11,到底
    的头像 发表于 06-25 14:51 372次阅读
    <b class='flag-5'>JDK8</b>升级<b class='flag-5'>JDK</b>11最全实践干货来了