阅读openjdk源代码
http://hllvm.group.iteye.com/group/topic/35385
類加載器子系統是么。樓上的方法是可以的,這里稍微展開點講。不過不要忘記看代碼之前先把相關規范了解一下,畢竟具體實現都是遵循規范的。?
先從java.lang.ClassLoader開始看,它的Java代碼的實現在:?
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/tip/src/share/classes/java/lang/ClassLoader.java?
其中,這個鏈接的前半段我是選了JDK7 update的開發分支的代碼倉庫做例子:?
http://hg.openjdk.java.net/jdk7u/jdk7u?
這是的代碼倉庫森林(repo forest),下面有hotspot、jdk等目錄,也就是OpenJDK里各子項目的代碼倉庫,例如jdk的就是在:?
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk?
這些目錄的意義…回頭再更新這帖來回復(待續)?
hotspot目錄是OpenJDK里包含的JVM,HotSpot VM所在的目錄。其中的目錄結構請參考我之前回復的另一帖:http://hllvm.group.iteye.com/group/topic/26998#193368?
繼續補完上面的鏈接解釋。要在頁面上瀏覽hg(Mercurial)管理的代碼倉庫的文件,就要在代碼倉庫地址后面舔上“/file/<version>”,其中“tip”是一個特別的版本標識,表示最新版。于是要看jdk目錄里的文件就是:?
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/tip?
(直接下載完整的OpenJDK源碼包也可以,那就可以忽略上面提到的鏈接的前半段,只參考后半段相對路徑即可。)?
接下來里面就是jdk子項目(也就是OpenJDK里的大部分類庫的實現)的內容了。其中?
classes與native目錄的結構就跟Java的包(package)目錄結構一樣,兩邊是對應的。知道這個關系就能很快找到JDK類庫里Java一側聲明為native的方法在C里的實現函數。?
這么一來就可以拼接出java.lang.ClassLoader的native函數的實現文件的鏈接:?
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/tip/src/share/native/java/lang/ClassLoader.c ?
留意到這跟最初的鏈接差別就是classes換成了native,.java換成了.c。?
JDK里大部分native實現都滿足這對應關系, 只有少量例外。?
順帶一提,平臺相關的代碼里的目錄結構也基本上跟share是一樣的??茨夸浢湍苤朗巧兑馑剂?。另外大部分Linux平臺相關代碼是在solaris目錄里的,要注意。?
在這ClassLoader.c文件里,可以看到這兩種調用:?
1、形如“(*env)->SomeFunction(env, ...)”這樣的。這種是JNI規范暴露出來的函數,真正的實現在JVM里;?
2、函數名有“JVM_”前綴的,例如“JVM_DefineClassWithSource”。這個是HotSpot VM與JDK類庫之間的私有接口,真正的具體實現當然也在JVM里。?
從前面給的另外一帖可以看到,HotSpot VM的JNI實現和與JDK之間的私有接口實現都在prims目錄里。具體說,?
1、JNI的實現的入口在jni.cpp里,也就是?
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/prims/jni.cpp ?
2、與JDK類庫之間的私有接口的實現的入口在jvm.cpp里,也就是?
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/prims/jvm.cpp ?
在這里面要進一步探索HotSpot VM的內部實現,就請參考前面說的另一帖吧。?
============================================================?
TL;DR 版介紹HotSpot VM的類加載子系統:?
最核心的組件大致有:?
1、 SystemDictionary ,這個用來記錄所有已加載的 (類型名, 類加載器) -> 類型 的映射關系,是最重要的中央結構;?
2、 ClassLoader ,這個是HotSpot VM所實現的bootstrap class loader;?
3、 ClassFileParser ,這個用來解析(parse)Class文件的內容,將其轉換為HotSpot VM內部的形式;?
4、上一條提到的 內部形式 (如klassOop、methodOop、symbolOop等)。這些在JDK7及之前的HotSpot VM里都主要存在所謂“PermGen”里,而從JDK8開始則在native memory里另外找了塊地方存;?
5、 Verifier ,類校驗器;?
6、 vmSymbols ,這是HotSpot VM有特殊處理的類、方法、字段等信息的聲明。
總結
以上是生活随笔為你收集整理的阅读openjdk源代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts2内置拦截器的简要介绍
- 下一篇: Struts2工作原理和框架扩展点