热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

JDK13的新特性之AppCDS详解

AppCDS的全称是ApplicationClass-DataSharing。主要是用来在不同的JVM中共享Class-Data信息,从而提升应用程序的启动速度。这篇文章主要介绍了JDK13的新特性:AppCDS详解,需要的朋友可以参考下

简介

AppCDS的全称是Application Class-Data Sharing。主要是用来在不同的JVM中共享Class-Data信息,从而提升应用程序的启动速度。

通常来说,如果要执行class字节码,JVM需要执行下面的一些步骤:给定一个类的名字,JVM需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来。

如果JVM启动的时候需要加载成百上千个class,那么需要的就不是一个小数目了。

对于打包好的jar包来说,只要jar的内容不变,那么jar包中的类的数据始终是相同的。JVM在启动时候每次都会运行相同的加载步骤。

AppCDS的作用就是将这些能够共享的数据归类成一个存储文件,在不同的JVM中共享。

基本步骤

对AppCDS有了基本的了解之后,我们讲一下AppCDS的大概工作流程:

  • 选择要归档的class,并创建一个class的列表,用在归档中。( -XX:DumpLoadedClassList)
  • 创建归档文件(-Xshare:dump和-XX:SharedArchiveFile)
  • 使用归档文件(-Xshare:on 和 -XX:SharedArchiveFile)

新的JVM可以使用归档文件来启动,从而减少了class加载的步骤。同时加载到内存中的区域甚至可以在其他的JVM实例中共享。从而极大的提高了JVM的启动速度。

下面我们从JDK class文件归档和应用程序class文件归档两个方面来讲解AppCDS的具体使用。

JDK class文件归档

最简单的AppCDS的例子就是归档JDK的class文件。JDK12,JDK13默认情况下已经开启了AppCDS的支持。如果需要停用,我们可以添加 -Xshare:off。

下面的例子专门用于JDK10和JDK11。

创建JDK class-data archive

我们可以使用-Xshare:dump来创建JVM启动时候默认加载的Class-Data:

java -Xshare:dump -XX:SharedArchiveFile=/tmp/sharedarchive.jsa

上面我们添加了参数-XX:SharedArchiveFile,为默认情况下java shared archive file文件会创建在JAVA_HOME/lib/server/下面,这个是需要root权限才能写入的。为了方便起见,我们手动指定了一个有读写权限的目录。

生成的文件大概有12M,接下来我们就可以使用这个JSA文件来启动java程序了。

使用JDK class-data archive启动应用程序

我们先写一个可以运行的CDS hello world:

public class CDSHelloWorld {
 public static void main(String[] args) {
  System.out.println("CDS Hello World");
 }
}

编译之后,我们运行下面的命令来使用上面创建的jsa文件:

java -Xlog:class+load:file=/tmp/sharedarchive.log -XX:SharedArchiveFile=/tmp/sharedarchive.jsa --enable-preview CDSHelloWorld

上面的命令添加了两个运行时参数:

-XX:SharedArchiveFile表示使用哪个具体的jsa文件来运行java程序。

-Xlog:class+load:file主要是做调试用的,将会把JVM的class load信息输出到指定的文件中,方便我们查看。这个unified logging特性是在JDK9中添加的,后面我们也会详细介绍。

简单查看一下生产的log文件:

[0.010s][info][class,load] opened: /Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home/lib/modules
[0.017s][info][class,load] java.lang.Object source: shared objects file
[0.017s][info][class,load] java.io.Serializable source: shared objects file
[0.017s][info][class,load] java.lang.Comparable source: shared objects file
...
[0.056s][info][class,load] CDSHelloWorld source: file:/Users/learn-java-base-9-to-14/java-13/target/classes/

从生成的日志文件我们可以看到,除了自己写的java文件,其他的java class都是从shared objects file中加载的。

运行时间对比

我们可以简单的使用time命令来对两种情况进行一下对比,看具体的运行时间差别:

time java -Xlog:class+load:file=/tmp/sharedarchive.log -XX:SharedArchiveFile=/tmp/sharedarchive.jsa --enable-preview CDSHelloWorld 
CDS Hello World
java -Xlog:class+load:file=/tmp/sharedarchive.log --enable-preview 

0.06s user 
0.06s system 
77% cpu 
0.164 total
time java --enable-preview CDSHelloWorld 
CDS Hello World
java --enable-preview CDSHelloWorld 

0.09s user 
0.06s system 
66% cpu 
0.222 total

HelloWorld只是一个简单的例子,可能两者的区别还不是特别明显。

如果是大型的项目,处理JDK自带的class之外,我们还可以将项目中共享的模块做成jsa文件,从而提升启动速度。

应用程序class文件归档

应用程序class文件归档和上面讲的JDK class文件归档很类似。基本步骤就是:1.列出运行应用程序时需要加载的class文件。2.将这class文件归档。

在JDK13之前,我们需要两步才能生成jsa文件。在JDK13之后,只需要一个命令就行了。

生成应用程序加载class的列表

我们可以使用XX:DumpLoadedClassList来生成应用程序加载class的列表:

java -XX:DumpLoadedClassList=/tmp/classes.lst --enable-preview CDSHelloWorld

我们可以得到类似下面的class文件列表:

java/lang/Object
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/constant/Constable
java/lang/constant/ConstantDesc

使用class文件列表生成jsa文件

有了class文件列表,我们就可以生成jsa文件了:

java -Xshare:dump -XX:SharedArchiveFile=/tmp/sharedarchive.jsa -XX:SharedClassListFile=/tmp/classes.lst 
--enable-preview CDSHelloWorld

跟之前的例子一样,只不过多了一个-XX:SharedClassListFile参数。

JDK13的新用法

在JDK13,一切都变得简单了,只需要一个-XX:ArchiveClassesAtExit就好:

java -XX:ArchiveClassesAtExit=/tmp/sharedarchive.jsa --enable-preview CDSHelloWorld

JVM将会在退出时生成jsa文件。

总结

AppCDS是一个新特性,在特别关注java启动时间的情况下可以考虑使用。

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

到此这篇关于JDK13的新特性:AppCDS详解的文章就介绍到这了,更多相关JDK13的新特性:AppCDS详解内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 打开文件管理器_【教程】模组管理器3.1食用指南
    文编:byakko最近有部分小伙伴反应还不会使用unity模组管理器,现在我就给大家讲一下unity模组管理器——从下载到使用。完整视频版以下是无WiF ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
author-avatar
一代天骄的小男人_580
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有