1 背景
JDK 5 中引入的 Class-Data Sharing (CDS) 技術(shù)允許將一組類預(yù)處理為共享存檔文件,然后可以在運行時進(jìn)行內(nèi)存映射以減少啟動時間。當(dāng)多個 JVM 共享同一個歸檔文件時,它還可以減少內(nèi)存占用。
在 OpenJDK 社區(qū),CDS 技術(shù)發(fā)展有兩個演進(jìn)方向:
擴(kuò)大archive的類的范圍:CDS -> AppCDS -> Dynamic CDS。
擴(kuò)大archive的數(shù)據(jù)種類:metadata(CDS、AppCDS、Dynamic AppCDS) -> 基本類對象 -> strings -> module -> Support for pre-generated java.lang.invoke classes in CDS archive。
Dynamic CDS特性(JEP 350: Dynamic CDS Archives[1])主要功能:
繼續(xù)增加類共享的范圍,提升共享類技術(shù)的收益
簡化使用 AppCDS 時 dump classlist 的操作,直接在程序退出時 dump 內(nèi)存中的類到 JSA 文件。
畢昇JDK 8 中實現(xiàn)的 Dynamic CDS 特性相比之前的 AppCDS ,增加了 Custom ClassLoader 的支持,擴(kuò)展了共享類的支持范圍;且該JDK版本帶有基本類的 base JSA 文件,可以消除 dump classlist 的步驟,提高該特性的易用性。經(jīng)測試,在使用此特性的情況下 SpringBoot 啟動時間具有顯著提升。
注:JEP 350 中 Dynamic CDS 增加支持的類(lambda、匿名類),畢昇JDK 8 暫時沒有實現(xiàn)。
2 特性介紹
Java 應(yīng)用程序使用base JSA運行,在程序執(zhí)行結(jié)束時對類進(jìn)行動態(tài)歸檔生成top JSA,top JSA將包含base JSA以外所有可以共享的類(包含Custom ClassLoader加載的類),共享類范圍的擴(kuò)大提供了更短的啟動時間,而且Dynamic CDS對于額外共享的類采用重定位(relocate)到一個更加緊湊的內(nèi)存空間以減少空間的浪費。
base JSA:使用CDS/AppCDS生成的類共享文件,當(dāng)不指定其路徑時,默認(rèn)為:$JAVA_HOME/jre/lib/
top JSA:使用Dynamic CDS生成的類共享文件。
注:類數(shù)據(jù)區(qū)分為讀寫、只讀,分別放置在RW、RO區(qū)。
此特性可以使用default JSA(JDK包中自帶的基本類的JSA文件)作為base JSA,因此可以簡化CDS特性使用步驟,生成top JSA后,運行程序時則同時將base JSA、top JSA映射到內(nèi)存中以加速啟動和節(jié)省內(nèi)存。
此特性為保證Customer ClassLoader加載類的正確性,與AppClassLoader、ExtClassLoader在FindLoadedClass時直接由classLoader來查找共享類不同,其在DefineClass中的基本校驗完畢后查詢共享類。
3 使用說明
3.1 相關(guān)參數(shù)說明
分類 | 選項 | 含義 |
---|---|---|
運行時選項 | -Xshare:on | 該參數(shù)繼承 CDS,使用共享文件 |
-XX:+UnlockExperimentalVMOptions | 開啟實驗特性 | |
-XX:SharedArchiveFile | 用于用戶首次啟動時指定 base JSA 文件,其是生成 top JSA 的基礎(chǔ) | |
-XX:ArchiveClassesAtExit | 用戶指定進(jìn)程退出時生成 top JSA 文件路徑。文件名支持按照進(jìn)程號 %p 輸出,可避免多JVM進(jìn)程復(fù)寫一份 top JSA,導(dǎo)致 top JSA 不可用 | |
日志開關(guān) | -XX:InfoDynamicCDS | 打開級別為 info 的日志,可以通過 -XX:DynamicCDSLog=PATH 設(shè)置輸出路徑,默認(rèn)為標(biāo)準(zhǔn)輸出流 |
-XX:DebugDynamicCDS | 打開級別為 debug 的日志,其余同上 | |
-XX:TraceDynamicCDS | 打開級別為 trace 的日志,其余同上 |
3.2 使用步驟
分為兩個步驟:
將可共享類的元數(shù)據(jù)(MetaData)dump 進(jìn)文件;
使用該文件執(zhí)行 Java 程序。
下面以 HelloWorld 程序為例簡單說明 Dynamic CDS 的用法。
預(yù)置條件:Java 程序 HelloWorld.class。
下面是每個步驟的命令行,相關(guān)參數(shù)說明請參見 JVM 參數(shù)說明。
步驟一:生成 top JSA(依賴 base JSA ),實驗特性開關(guān)需要使能
java-XX:+UnlockExperimentalVMOptions-Xshare:on-XX:ArchiveClassesAtExit=top.jsa-XX:+InfoDynamicCDSHelloWorld
如果因為某些參數(shù)改變,導(dǎo)致 JDK 包中帶的 default JSA 無法使用,請重新用 CDS/AppCDS 生成 base JSA。
非正常結(jié)束的進(jìn)程,比如 kill -9 殺死進(jìn)程,則無法生成 JSA,則需要通過 jcmd
可省略 -XX:SharedArchiveFile 參數(shù),此時默認(rèn)使用 -XX:SharedArchiveFile=$JAVA_HOME/jre/lib/
因為生成 JSA 過程中會修改運行時數(shù)據(jù),無法保證運行時正確,因此 dump top JSA 結(jié)束后直接退出進(jìn)程。
步驟二:使用 top JSA 運行 Java 程序
java-XX:+UnlockExperimentalVMOptions-Xshare:on-XX:ArchiveClassesAtExit=top.jsa-XX:+InfoDynamicCDSHelloWorld
top JSA 中記錄了 base JSA 的路徑,可以在參數(shù)中只指明 top JSA 。如果 base JSA 路徑在 top JSA 生成之后發(fā)生了改變,需要同時指明 base、top JSA 的路徑:
java-Xshare:on-XX:SharedArchiveFile=base.jsa:top.jsa-XX:+InfoDynamicCDSHelloWorld
3.3 使用限制
生成、使用JSA兩階段參數(shù)和環(huán)境PAGE_SIZE必須一致
restore階段使用參數(shù) -XX:ObjectAlignmentInBytes=32、16 時,運行時會報錯,信息如下:
ErroroccurredduringinitializationofVM Unabletousesharedarchive. Anerrorhasoccurredwhileprocessingthesharedarchivefile. Thesharedarchivefile'sObjectAlignmentInBytesof8doesnotequalthecurrentObjectAlignmentInBytesof32.
錯誤原因:因為生成 base JSA 時,ObjectAlignmentInBytes 默認(rèn)為8,讀取時不支持指定其他對齊參數(shù)。
解決方法:重新使用 CDS/AppCDS 生成 base JSA 使用,生成時參數(shù)加入使用時對應(yīng)的 -XX:ObjectAlignmentInBytes 的值即可。
當(dāng)dump時的系統(tǒng)環(huán)境變量pagesize小于使用時的pagesize,運行時會報錯,信息如下:
Anerrorhasoccurredwhileprocessingthesharedarchivefile. UnabletomapReadOnlysharedspaceatrequiredaddress. ErroroccurredduringinitializationofVM Unabletousesharedarchive.
錯誤原因:page_size 影響 JSA 文件中的數(shù)據(jù)對齊,系統(tǒng)無法為JSA文件恢復(fù)分配內(nèi)存。
解決方法:重新使用 CDS/AppCDS 在當(dāng)前環(huán)境生成 JSA 使用即可。
不支持關(guān)閉壓縮指針
使用 CDS(restore)階段使用參數(shù) -XX:-UseCompressedOops 或 -XX:-UseCompressedClassPointers 時,運行時會報錯,信息如下:
ErroroccurredduringinitializationofVM Unabletousesharedarchive.:UseCompressedOopsandUseCompressedClassPointersmustbeonforUseSharedSpaces. Classdatasharingisinconsistentwithotherspecifiedoptions.
錯誤原因:目前 CDS 只支持壓縮指針場景。
解決方法:使用時應(yīng)當(dāng)開啟壓縮指針開關(guān),后續(xù)會支持壓縮指針關(guān)閉場景。
最大堆地址值需小于32G(當(dāng)使用默認(rèn)參數(shù) -XX:ObjectAlignmentInBytes=8)
使用 CDS(restore)階段使用參數(shù)和 (值 )的組合,運行時會報錯,信息如下:
Anerrorhasoccurredwhileprocessingthesharedarchivefile. Unabletoreservesharedspaceatrequiredaddress0x0000000800000000 ErroroccurredduringinitializationofVM Unabletousesharedarchive.
錯誤原因:JSA 文件的映射地址的堆區(qū)間,不能被參數(shù)所指定的JVM 其他組件占用。
解決方法:將此組合值 改為小于 32 可正常運行。
Dynamic CDS 不支持的共享類
Java version1.5 以及之前的類不支持共享。
JVM anonymous class 不支持共享。
如果基類不支持共享,則該類也不支持共享。
Dynamic CDS 不支持 JFR
JFR組件啟動過程會通過 asm 動態(tài)創(chuàng)建匿名類(anonymous class),與 Dynamic CDS 沖突。
4 性能測試
SpringBoot場景測試結(jié)果:
測試說明:
經(jīng)測試,使能 Dynamic CDS 特性相比于默認(rèn)參數(shù) java -jar spring-petclinic-2.5.0-SNAPSHOT.jar 啟動效率會提升14.3%。
5 特性演進(jìn)
后續(xù)畢昇JDK8 CDS特性將支持壓縮指針關(guān)閉場景。
審核編輯:湯梓紅
-
Dynamic
+關(guān)注
關(guān)注
0文章
5瀏覽量
7619 -
JDK
+關(guān)注
關(guān)注
0文章
82瀏覽量
16767 -
cds
+關(guān)注
關(guān)注
0文章
14瀏覽量
14537
原文標(biāo)題:畢昇JDK 8 Dynamic CDS 特性介紹
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
關(guān)于畢昇杯,求助
JDK 15安裝步驟及新特性
IBM Informix Dynamic Server入門指
什么是cds?CDS是什么意思?
如何解決JDK8小版本升級后性能下降的問題

畢昇Fortran編譯器內(nèi)聯(lián)動態(tài)庫函數(shù)str_copy
人工智能等領(lǐng)域涌現(xiàn)出多樣的異構(gòu)算力
JDK11升級JDK17最全實踐

weblogic修改jdk路徑
畢昇大模型應(yīng)用開發(fā)平臺+浪潮信息AIStation,讓大模型定制更簡單

JDK11升級JDK17最全實踐干貨來了

JDK8升級JDK11最全實踐干貨來了

評論