JDK13的新特性之AppCDS详解

 更新时间:2020年5月12日 09:37  点击:1722

简介

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详解内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • JavaScript中的Reflect对象详解(ES6新特性)

    这篇文章主要介绍了JavaScript中的Reflect对象(ES6新特性)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-29
  • MySQL 5.6 GTID新特性实践

    GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。下文给大家介绍MySQL 5.6 GTID新特性实践,感兴趣的朋友一起看看吧...2016-10-20
  • ES6新特性之变量和字符串用法示例

    这篇文章主要介绍了ES6新特性之变量和字符串用法,结合具体实例形式分析了ES6中变量与字符串的特性、使用方法与相关注意事项,需要的朋友可以参考下...2017-04-03
  • C++17新特性个人总结

    这篇文章主要介绍了C++17新特性个人总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-22
  • ES6新特性之类(Class)和继承(Extends)相关概念与用法分析

    这篇文章主要介绍了ES6新特性之类(Class)和继承(Extends)相关概念与用法,结合实例形式较为详细的分析了ES6中类(Class)和继承(Extends)的基本概念、语法、使用方法与注意事项,需要的朋友可以参考下...2017-05-27
  • python3.9之你应该知道的新特性详解

    这篇文章主要介绍了python3.9之你应该知道的新特性详解,需要的朋友可以参考下...2021-04-29
  • ES6新特性之解构、参数、模块和记号用法示例

    这篇文章主要介绍了ES6新特性之解构、参数、模块和记号用法,结合实例形式分析了解构、参数、模块和记号的功能、用法及相关使用注意事项,需要的朋友可以参考下...2017-04-03
  • MySQL8新特性之全局参数持久化详解

    从8.0开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中,下面这篇文章主要给大家介绍了关于MySQL8新特性之全局参数持久化的相关资料,需要的朋友可以参考下...2021-10-11
  • 干货来袭! C# 7.0 新特性(VS2017可用)

    干货来袭! 为大家分享了C# 7.0 新特性,VS2017可用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • PHP7新特性foreach 修改使用例子

    PHP7新特性foreach与前版本稍一些改变了,那么在PHP7新特性foreach到底作了什么改变呢,我们下面一起来看看PHP7新特性foreach 修改使用例子,希望文章能够帮助到大家。...2016-11-25
  • asp.net使用H5新特性实现异步上传的示例

    下面小编就为大家分享一篇asp.net使用H5新特性实现异步上传的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
  • 即将发布的jQuery 3 有哪些新特性

    本文主要介绍jQuery 3中一些新增的特性和一些变更的特性,以及一些废弃删除的特性,另外介绍了jQuery 3.0 最大的变化就是彻底放弃对 IE8 的支持,大家可以先看一下。...2016-04-17
  • 解析MySQL8.0新特性——事务性数据字典与原子DDL

    这篇文章主要介绍了MySQL8.0新特性——事务性数据字典与原子DDL的相关资料,帮助大家更好的理解和学习MySQL8.0感兴趣的朋友可以了解下...2020-08-26
  • C#7.0中新特性汇总

    C#7.0 增加了许多新功能,并专注于数据消费,简化代码和性能的改善。接下来通过本文给大家介绍C#7.0中新特性汇总,需要的朋友可以参考下...2020-06-25
  • ES6新特性之函数的扩展实例详解

    这篇文章主要介绍了ES6新特性之函数的扩展,实例形式较为详细的分析了ES6针对函数参数、运算符及相关新特性的扩展操作与注意事项,需要的朋友可以参考下...2017-04-03
  • PHP5新特性,__autoload

    因为创建PYTHON中国(www.okpython.com)和推广PYTHON,所以一直没时间去研究PHP5的特性,现在终于有时间了。 今天说下__autoload函数的功能: 说明:自动加载类文件...2016-11-25
  • MIUI 8有哪些新功能 小米MIUI 8系统实用新特性功能详情解答

    MIUI 8作为新一代小米系统,备受米粉们的关注,很多米粉们都想知道MIUI 8有哪些新功能特性?值得更新吗?针对这一问题,本文小编就为大家图文介绍小米MIUI 8新特性功能汇总...2016-07-04
  • C++11/14的新特性(更简洁)

    这篇文章主要介绍了C++11/14的新特性(更简洁),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • 你应该知道的Python3.6、3.7、3.8新特性小结

    这篇文章主要介绍了你应该知道的Python3.6、3.7、3.8新特性小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-13
  • C# 8.0新特性介绍

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。下面通过本文给大家分享下C# 8.0的三个令人兴奋的新特性,需要的朋友参考下吧...2020-06-25