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…

相關文章
相關標籤/搜索