執行字節碼時,JVM須要一些準備的工做。傳類名,在磁盤上查找類,加載它,驗證字節碼,將類裝載爲本身的內部數據結構,每一步都須要花費一些時間,想一想每次JVM都要加載成千上萬個類,這時時間上的花費很明顯能夠看得出來。java
由於Jar包並無改變,class-data一直都是相同的,每次JVM執行的也是相同的查找,加載,驗證動做。bash
AppCDS就是讓類只作一次上述的驗證,加載動做,而後將其打包,後續在運行相同的jar包時,直接從打包文件中讀取類數據,或者當前同時運行的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
複製代碼
打印類加載日誌,查看日誌文件中的信息,若是出現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
複製代碼
明顯看出來在使用歸檔以後用戶態的時間縮短了一些,此次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
複製代碼
其實JDK13已經默認幫咱們把系統的類文件進行歸檔了,咱們在使用的時候也不須要指定什麼參數,默認-Xshare:on
。系統類的歸檔咱們不須要關係太多,那麼如何打包咱們的應用類文件呢。
1 使用-XX:DumpLoadedClassList=classes.lst
查看當前JVM裝載的類列表
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
複製代碼
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
複製代碼
有過有人更新了jar包的內容,共享類會怎麼處理?
能夠查看日誌看一下,是否會加載修改後的類。-Xlog:class+load:file=cds.log
若是有任何問題,仍是-Xlog:class+load:file=cds.log
看一下狀況。
JDK13中使用AppCDS的選項-XX:ArchiveClassesAtExit=${ARCHIVE}
,-XX:SharedArchiveFile=${ARCHIVE}