JDK13之APPCDS实战

执行字节码时,JVM须要一些准备的工做。传类名,在磁盘上查找类,加载它,验证字节码,将类装载为本身的内部数据结构,每一步都须要花费一些时间,想一想每次JVM都要加载成千上万个类,这时时间上的花费很明显能够看得出来。java

由于Jar包并无改变,class-data一直都是相同的,每次JVM执行的也是相同的查找,加载,验证动做。bash

AppCDS就是让类只作一次上述的验证,加载动做,而后将其打包,后续在运行相同的jar包时,直接从打包文件中读取类数据,或者当前同时运行的JVM实例直接共享一份相同的类数据。数据结构

  • 不须要在进行复杂的类加载机制的每一步
  • 多个JVM实例同时运行时,能够共享内存区

使用方式

使用APPCDS的完整步骤通常以下,不过如今JDK13简化了咱们的操做,通常我不须要进行下面的全部步骤。app

1 建立一个class的列表,让这些class能够被打包。jvm

-XX:DumpLoadedClassList
复制代码

2 建立归档使用ui

-Xshare:dump  -XX:SharedArchiveFile
复制代码

3 使用归档spa

-Xshare:on -XX:SharedArchiveFile
复制代码

归档系统类

建立归档

在JDK13中,系统内置的共享类以及被默认建立了,位于${JAVA_HOME}/lib/server目录下3d

# 例如
ls /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/lib/server
# 列出classes.jsa libjsig.dylib libjvm.dylib
复制代码

image-20191105072238204

使用归档

打印类加载日志,查看日志文件中的信息,若是出现shared objects files表明使用了appcds的归档文件。日志

**注意:**不是全部的类都会被共享,当前咱们自定义的类仍然会走所有的类装载流程。code

# 使用归档文件
/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java  -Xlog:class+load:file=cds.log -XX:SharedArchiveFile=jdk13.jsa -jar target/HelloApp.jar

# 不使用归档文件
/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java  -Xlog:class+load:file=nocds.log -Xshare:off -jar target/HelloApp.jar

复制代码

image-20191105072957619

时间对比

明显看出来在使用归档以后用户态的时间缩短了一些,此次jar包,仅仅打印Hello World,没有作任何事情,若是在类增多的时候,效果就很是明细。

time /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java  -XX:SharedArchiveFile=jdk13.jsa -jar target/HelloApp.jar

time /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java  -Xshare:off -jar target/HelloApp.jar
复制代码

image-20191105073214565

归档自定义类

其实JDK13已经默认帮咱们把系统的类文件进行归档了,咱们在使用的时候也不须要指定什么参数,默认-Xshare:on。系统类的归档咱们不须要关系太多,那么如何打包咱们的应用类文件呢。

1 使用-XX:DumpLoadedClassList=classes.lst 查看当前JVM装载的类列表

image-20191105074017506

2 使用-XX:SharedClassListFile=classes.lst来指定那些类须要共享,以及指定-XX:SharedArchiveFile=app-cds.jsa打包文件位置,这里不须要使用-jar来运行程序,指定jar包的位置便可。

/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java -Xshare:dump  -XX:SharedClassListFile=classes.lst  -XX:SharedArchiveFile=jdk13-custom.jsa --class-path  target/HelloApp.jar
复制代码

image-20191105074522145

3 能够在JVM退出的时候,自动归档,使用选项-XX:ArchiveClassesAtExit=app-cds.jsa

4 使用归档文件

/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java  -XX:SharedArchiveFile=jdk13-custom.jsa -jar target/HelloApp.jar
复制代码

image-20191105074817756

问题

有过有人更新了jar包的内容,共享类会怎么处理?

能够查看日志看一下,是否会加载修改后的类。-Xlog:class+load:file=cds.log

若是有任何问题,仍是-Xlog:class+load:file=cds.log看一下状况。

最后

JDK13中使用AppCDS的选项-XX:ArchiveClassesAtExit=${ARCHIVE}-XX:SharedArchiveFile=${ARCHIVE}

参考:blog.codefx.org/java/applic…

相关文章
相关标签/搜索