這篇文章主要為大家展示了JDK13中的AppCDS是什么,內(nèi)容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、重慶小程序開發(fā)公司、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了龍鳳免費建站歡迎大家使用!
簡介
AppCDS的全稱是Application Class-Data Sharing。主要是用來在不同的JVM中共享Class-Data信息,從而提升應用程序的啟動速度。
通常來說,如果要執(zhí)行class字節(jié)碼,JVM需要執(zhí)行下面的一些步驟:給定一個類的名字,JVM需要從磁盤上面找到這個文件,加載,并驗證字節(jié)碼,最后將它加載進來。
如果JVM啟動的時候需要加載成百上千個class,那么需要的就不是一個小數(shù)目了。
對于打包好的jar包來說,只要jar的內(nèi)容不變,那么jar包中的類的數(shù)據(jù)始終是相同的。JVM在啟動時候每次都會運行相同的加載步驟。
AppCDS的作用就是將這些能夠共享的數(shù)據(jù)歸類成一個存儲文件,在不同的JVM中共享。
基本步驟
對AppCDS有了基本的了解之后,我們講一下AppCDS的大概工作流程:
新的JVM可以使用歸檔文件來啟動,從而減少了class加載的步驟。同時加載到內(nèi)存中的區(qū)域甚至可以在其他的JVM實例中共享。從而極大的提高了JVM的啟動速度。
下面我們從JDK class文件歸檔和應用程序class文件歸檔兩個方面來講解AppCDS的具體使用。
JDK class文件歸檔
最簡單的AppCDS的例子就是歸檔JDK的class文件。JDK12,JDK13默認情況下已經(jīng)開啟了AppCDS的支持。如果需要停用,我們可以添加 -Xshare:off。
下面的例子專門用于JDK10和JDK11。
創(chuàng)建JDK class-data archive
我們可以使用-Xshare:dump來創(chuàng)建JVM啟動時候默認加載的Class-Data:
java -Xshare:dump -XX:SharedArchiveFile=/tmp/sharedarchive.jsa
上面我們添加了參數(shù)-XX:SharedArchiveFile,為默認情況下java shared archive file文件會創(chuàng)建在JAVA_HOME/lib/server/下面,這個是需要root權(quán)限才能寫入的。為了方便起見,我們手動指定了一個有讀寫權(quán)限的目錄。
生成的文件大概有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"); } }
編譯之后,我們運行下面的命令來使用上面創(chuàng)建的jsa文件:
java -Xlog:class+load:file=/tmp/sharedarchive.log -XX:SharedArchiveFile=/tmp/sharedarchive.jsa --enable-preview CDSHelloWorld
上面的命令添加了兩個運行時參數(shù):
-XX:SharedArchiveFile表示使用哪個具體的jsa文件來運行java程序。
-Xlog:class+load:file主要是做調(diào)試用的,將會把JVM的class load信息輸出到指定的文件中,方便我們查看。這個unified logging特性是在JDK9中添加的,后面我們也會詳細介紹。
簡單查看一下生產(chǎn)的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只是一個簡單的例子,可能兩者的區(qū)別還不是特別明顯。
如果是大型的項目,處理JDK自帶的class之外,我們還可以將項目中共享的模塊做成jsa文件,從而提升啟動速度。
應用程序class文件歸檔
應用程序class文件歸檔和上面講的JDK class文件歸檔很類似?;静襟E就是: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參數(shù)。
JDK13的新用法
在JDK13,一切都變得簡單了,只需要一個-XX:ArchiveClassesAtExit就好:
java -XX:ArchiveClassesAtExit=/tmp/sharedarchive.jsa --enable-preview CDSHelloWorld
JVM將會在退出時生成jsa文件。
以上就是關(guān)于JDK13中的AppCDS是什么的內(nèi)容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。