• Java SE 10 Application Class-Data Sharing 示例


    Java SE 10 Application Class-Data Sharing 示例

    作者:Grey

    原文地址:

    博客园:Java SE 10 Application Class-Data Sharing 示例

    CSDN: Java SE 10 Application Class-Data Sharing 示例

    Class-Data Sharing

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

    通常来说,如果要执行 class 字节码,JVM需要执行下面的一些步骤:给定一个类的名字,JVM 需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来。如果 JVM 启动的时候需要加载成百上千个 class ,那么需要的就不是一个小数目了。

    对于打包好的 jar 包来说,只要 jar 的内容不变,那么 jar 包中的类的数据始终是相同的。JVM 在启动时候每次都会运行相同的加载步骤。CDS 的作用就是将这些能够共享的数据归类成一个存储文件,在不同的 JVM 中共享。这样可以实现两个目标:

    1. 缩短JVM的启动时间。
    2. 减少JVM的内存占用。

    当 JVM 启动时,它从文件系统中加载 JDK 类库(到JDK 8为止,从jre/lib/rt.jar文件;从JDK 9开始,从jmods目录下的jmod文件)。在这个过程中,类文件被从档案中提取出来,转换为特定架构的二进制形式,并存储在JVM进程的主内存中。

    如果在同一台机器上启动了多个JVM,这个过程会重复进行。每个 JVM 在内存中保留其类库的副本。

    CDS 的工作原理如下。

    1. 使用-Xshare:dump命令,创建一个叫做classes.jsa的文件(JSA 代表 Java Shared Archive)。这个文件包含了当前架构下的二进制格式的完整类库。
    2. 当 JVM 启动时,操作系统使用 内存映射 I/O将该文件 "映射 "到 JVM 的内存中。首先,这比加载 jar 或 jmod 文件要快。其次,操作系统只将文件加载到 RAM 中一次,为每个 JVM 进程提供同一内存区域的只读视图。

    Application Class-Data Sharing

    Application Class-Data Sharing 扩展了 CDS,不仅可以将 JDK 类库,还可以将应用程序的类存储在 JSA 文件中,并在 JVM 进程中共享。

    以下示例代码演示了App CDS 的功能。

    规划项目目录

    hello-cds
     - src
      - git
       - snippets
        - cds
         - App.java
         - Helper.java
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Java 版本需要使用 JDK 10。

    代码清单

    App.java

    package git.snippets.cds;
    
    public class App {
      public static void main(String[] args) {
        new Helper().greet();
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Helper.java

    package git.snippets.cds;
    
    public class Helper {
      public void greet() {
        System.out.println("Hello world!");
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    接下来在hello-cds根目录下新建target目录,并运行如下命令进行编译

    javac -d target/classes src/git/snippets/cds/*.java
    
    • 1

    打包

    jar cf target/helloworld.jar -C target/classes .
    
    • 1

    运行

    java -cp target/helloworld.jar git.snippets.cds.App
    
    • 1

    可以看到控制台打印

    Hello world!
    
    • 1

    接下来开始使用 Application CDS , 我们通过如下命令创建一个helloworld.lst

    java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=helloworld.lst -cp target/helloworld.jar git.snippets.cds.App
    
    • 1

    注意。此命令仅在 OpenJDK 中有效。在 Oracle JDK 中,你会得到一个警告,说 Application CDS 是一个商业特性,你必须先解锁(用-XX:+UnlockCommercialFeatures)。所以最好使用 OpenJDK,且 JDK 版本必须是10。如果你使用Oracle JDK,用如下命令代替

    java -XX:+UnlockCommercialFeatures -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=helloworld.lst -cp target/helloworld.jar git.snippets.cds.App
    
    • 1

    可以用记事本打开 helloworld.lst ,发现里面包括了所有相关的class清单,这里面不仅有 JDK 的 class,也有应用程序的 class。

    java/lang/Object
    java/lang/String
    java/io/Serializable
    java/lang/Comparable
    java/lang/CharSequence
    java/lang/Class
    ....
    git/snippets/cds/App
    java/lang/PublicMethods$MethodList
    java/lang/PublicMethods$Key
    git/snippets/cds/Helper
    java/lang/Shutdown
    java/lang/Shutdown$Lock
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    接下来,我们通过 lst 问题创建 JSA 文件,

    如果使用OpenJDK 10,则用如下命令

    java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=helloworld.lst -XX:SharedArchiveFile=helloworld.jsa -cp target/helloworld.jar
    
    • 1

    如果使用Oracle JDK 10,使用如下命令

    java -Xshare:dump -XX:+UnlockCommercialFeatures -XX:+UseAppCDS -XX:SharedClassListFile=helloworld.lst -XX:SharedArchiveFile=helloworld.jsa -cp target/helloworld.jar
    
    • 1

    控制台输出如下信息

    narrow_klass_base = 0x0000000800000000, narrow_klass_shift = 3
    Allocated temporary class space: 1073741824 bytes at 0x00000008c0000000
    Allocated shared space: 3221225472 bytes at 0x0000000800000000
    Loading classes to share ...
    Loading classes to share: done.
    Rewriting and linking classes ...
    Rewriting and linking classes: done
    Number of classes 689
        instance classes   =   609
        obj array classes  =    72
        type array classes =     8
    Updating ConstMethods ... done.
    Removing unshareable information ... done.
    Scanning all metaspace objects ...
    Allocating RW objects ...
    Allocating RO objects ...
    Relocating embedded pointers ...
    Relocating external roots ...
    Dumping symbol table ...
    Relocating SystemDictionary::_well_known_klasses[] ...
    Removing java_mirror ... done.
    mc  space:      5656 [  0.1% of total] out of     65536 bytes [  8.6% used] at 0x0000000800000000
    rw  space:   2079360 [ 21.4% of total] out of   2097152 bytes [ 99.2% used] at 0x0000000800010000
    ro  space:   3934688 [ 40.6% of total] out of   3997696 bytes [ 98.4% used] at 0x0000000800210000
    md  space:      6160 [  0.1% of total] out of     65536 bytes [  9.4% used] at 0x00000008005e0000
    od  space:   3413720 [ 35.2% of total] out of   3473408 bytes [ 98.3% used] at 0x00000008005f0000
    total    :   9439584 [100.0% of total] out of   9699328 bytes [ 97.3% used]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    生成的 helloworld.jsa 文件仅 9.31 MB 大小

    使用jsa文件重新运行程序

    如果使用OpenJDK 10运行如下命令

    java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=helloworld.jsa -cp target/helloworld.jar git.snippets.cds.App
    
    • 1

    如果使用Oracle JDK 10,运行如下命令

    java -Xshare:on -XX:+UnlockCommercialFeatures -XX:+UseAppCDS -XX:SharedArchiveFile=helloworld.jsa -cp target/helloworld.jar git.snippets.cds.App
    
    • 1

    控制台输出

    Hello world!
    
    • 1

    源码

    hello-cds

    参考文档

    JDK13的新特性:AppCDS详解

    Java 10 Features (with Examples)

    JEP 310: Application Class-Data Sharing

    更多

    Java SE 7及以后各版本新增特性,持续更新中…

  • 相关阅读:
    linux驱动之内核定时器
    cs软件ui构建办法
    m基于ACO蚁群算法的考虑装载率的循环送货的最短线路规划MATLAB仿真
    易语言更换HTTP
    要啥自行车:Skype Beta不够用的嘛
    zookeeper的基本概念
    Oracle 数据库历史备份数据恢复验证
    Java学习笔记 --- 构造器
    JavaWeb使用Cookie记住上次的访问时间/附完整源码
    使用IDEA创建一个SpringBoot项目
  • 原文地址:https://blog.csdn.net/hotonyhui/article/details/126440912