2015-02-06 59 views
0

Oracle documentation將/jdk1.7.0/jre/lib/rt.jar描述爲用於java運行時的引導類,我很好奇它們在運行JDK而不是JRE時是否加載過,以及if那麼在運行時如何將這些替換爲熱點類呢?在jvm中加載java熱點類

例如rt.jar似乎沒有包含與hotspot/jdk/src/share/classes/java/util/Collections.java相對應的類,因此如果我將JDK6版本作爲JDK添加到eclipse中,通過在調試器中執行以下操作:

Collections.emptySet().iterator(); 

我得到對應的rt.jar /代碼這將創建一個新的迭代器實例j​​ava.util.Collections中,wheras熱點版本從src.zip哪些池空迭代似乎並不存在。

我的理解一直是,熱點代碼將在運行前/運行期間鏈接,因此我懷疑我剛剛錯過了位置,但是如果這不是真的,熱點代碼如何鏈接?

回答

0

爪哇SE分佈爲JCL源的release之前版本作爲在OpenJDK reference實現的一部分具有其src.zip之間的差異(在rt.jar中相應的編譯的類),並且backported的OpenJDK 6的源代碼是available online

其原因是,從OpenJDK 7的,變化,例如該合併迭代器,可以被移植入的OpenJDK 6個版本,無需在正在作出任何的Java SE 6版本的相應變化,通過從該SCM圖所示OpenJDK 6 project

http://openjdk.java.net/projects/jdk6/images/OpenJDK6-genealogy.png

如Arkantos所提到的,自舉類加載器將load rt.jar,包括Collections.class在Java SE 6分佈中的非池迭代器。

1

所有Java程序都需要運行JRE。即使JDK在其中也有一個子文件夾jre。 JDK是供開發人員編寫,編譯,剖析Java程序的。所有來自java.langjava.util的類都存在於rt.jar(運行時的快捷方式)中,該類將在Bootstrap ClassLoader執行的每個Java程序中加載。

src.zip是Java SE APIs的源代碼,它不包含熱點源代碼/虛擬機代碼以及用C/C++編寫的其他一些東西,但它可供所有人下載。

我剛剛比較了JAVA_HOME/src.zipJAVA_HOME/jre/lib/rt.jar中的java.util.Collections.emptySet().iterator(),發現它們是相同的。

+0

感謝您的詳細信息,你沒有說你在哪個版本的Java比較?我向你提供了Bootstrap Class Loader的參考資料,但由於我必須自己做研究才能完全回答我自己的問題,所以我已將其作爲答案發布。 – MilesHampson 2015-02-09 10:28:48

+0

我比較了那些有jdk8u25的本地文件 – Arkantos 2015-02-09 15:52:02