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