日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK13的新特性:AppCDS详解

發布時間:2024/2/28 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK13的新特性:AppCDS详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 基本步驟
  • JDK class文件歸檔
    • 創建JDK class-data archive
    • 使用JDK class-data archive啟動應用程序
    • 運行時間對比
  • 應用程序class文件歸檔
    • 生成應用程序加載class的列表
    • 使用class文件列表生成jsa文件
    • JDK13的新用法
  • 總結

簡介

AppCDS的全稱是Application Class-Data Sharing。主要是用來在不同的JVM中共享Class-Data信息,從而提升應用程序的啟動速度。

通常來說,如果要執行class字節碼,JVM需要執行下面的一些步驟:給定一個類的名字,JVM需要從磁盤上面找到這個文件,加載,并驗證字節碼,最后將它加載進來。

如果JVM啟動的時候需要加載成百上千個class,那么需要的就不是一個小數目了。

對于打包好的jar包來說,只要jar的內容不變,那么jar包中的類的數據始終是相同的。JVM在啟動時候每次都會運行相同的加載步驟。

更多內容請訪問www.flydean.com

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

    更多精彩內容且看:

    • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
    • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
    • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
    • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

    本文作者:flydean程序那些事

    本文鏈接:http://www.flydean.com/jdk13-appcds/

    本文來源:flydean的博客

    歡迎關注我的公眾號:程序那些事,更多精彩等著您!

    總結

    以上是生活随笔為你收集整理的JDK13的新特性:AppCDS详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。