天天看點

openjdk源碼閱讀導航

轉自:http://rednaxelafx.iteye.com/blog/1549577

這是連結帖。主體内容都在各連結中。 

怕放草稿箱裡過會兒又坑掉了,總之先發出來再說…回頭再慢慢補充内容。 

先把ItEye網站上的資訊聚合起來。 

近期提問帖: 

閱讀openjdk源代碼 

如何來看OpenJDK源碼 

如何分析OpenJDK中JVM的實作 

一個個回複太麻煩了,合在一塊兒寫這麼一篇。 

================ 

前言 

我的VM帖的索引 

進階語言虛拟機(HLLVM)群組 

新浪微群“JVM源碼閱讀活動” 

如何建構javac的調試環境 

為什麼有時候調試代碼的時候看不到變量的值 

自己編譯JDK的src.zip的步驟 

Ubuntu下編譯openjdk成為可調試版 

有人在Centos5 下build jdk1.6 成功嗎? 

ItEye論壇讨論帖: 

Java IDE 添加 JDK 源代碼關聯 

JDK(32bit)的進階安裝——Client模式與Server模式 

=========================== 

OpenJDK概況 

http://openjdk.java.net 

OpenJDK曆史 

曾任OpenJDK 6項目釋出經理一職的Joe Darcy在OSCON 2011上講解了JDK與OpenJDK的曆史與現狀。下面引用他的示範稿中的幾幅圖。 

OpenJDK的曆史與版本系譜: 

Joe Darcy 寫道

Joe在他更早的一篇博文裡較長的描述過OpenJDK(特别是OpenJDK 6)的系譜。同一段文字也釋出在OpenJDK的JDK 6項目首頁面。 

Red Hat的Deepak Bhole則從項目的開源性角度寫了另一篇講述OpenJDK項目曆史的博文。 

Deepak Bhole 寫道

綜合上述資料及其它來源的一些資訊可知: 

Sun JDK有“釋出列車”(release train)的概念。例如說,在JDK 6還在早期開發階段,連首個版本都尚未釋出時,JDK 6就是最新的開發分支,而同時也存在着JDK 1.4.2 update和JDK 5 update兩個老版本的維護分支。開發通常是在最新分支上進行的;當功能或修複在最新分支上穩定下來之後,會backport到老版本的維護分支。 

... \
 |  JDK 1.4.2 update -> ...
 v
JDK 5
 |\
 |  JDK 5 update -> ...
 v
JDK 6
 |\
 |  JDK 6 update -> ...
 v
...      

類似這樣。當Sun決定将JDK開源出來時,JDK 6與JDK 6 update 1都已經正式釋出,而JDK 6 update維護分支已經從最新開發分支分離出來一段時間了;此時最新的開發分支是JDK 7。是以很自然的,OpenJDK以JDK 7為基礎演化而來。 

開源Java社群歡迎OpenJDK的工作,但JDK 7尚在早期開發階段,不适合實際部署。在社群需求的驅動下,OpenJDK建立了JDK 6的對應版本——OpenJDK 6項目。但這份代碼并不是從JDK 6 update分支開源而來,而是以OpenJDK 7 build 20為基礎,将一些不适合放在JDK 6的代碼去掉之後再打上JDK 6 update分支累積的一些代碼更新而來。然後JDK 6 update、(Open)JDK 7、OpenJDK 6三個分支就分開發展了。這就是上面的系譜圖所展現的情況。 

在Oracle完成對Sun的收購後,OpenJDK的開發模型基本維持跟原本Sun時代一緻;隻在非常最近才開始有新的變化。在JDK 7正式釋出、JDK 7 update項目建立後,JDK 8就成為了現在的最新開發分支。 

現狀是,Oracle主要也是在OpenJDK上進行主要的功能開發,這部分是以GPLv2 + Classpath Exception許可證完全開源的。同時Oracle也在開發一些商用的、閉源的功能,例如Java Flight Recorder。将這些閉源功能疊加在開源的OpenJDK上打包起來,就是産品版的Oracle JDK 7 / 7 update / 8。 

OpenJDK與Oracle JDK 

大家都會對這個問題感興趣:OpenJDK與Oracle JDK到底有多像? 

說真的我也不知道準确答案。從外部看: 

  • JDK 6的源碼從最早的JDK 6到JDK 6 update 23都有以JRL許可證釋出。但上面的系譜已經說明了,Oracle/Sun JDK 6的源碼跟OpenJDK 6的源碼由于來源路徑的不同,本來就會存在一定的差異,是以并不适合直接用于比較。
  • Oracle JDK 7的源碼沒有像JDK 6那樣以JRL許可證釋出,外界無法比較它與OpenJDK 7的準确差異。JDK 7 update、JDK 8都是同理。

這種情況下,還是讓我們相信Joe Darcy的說法吧。繼續引用他在OSCON 2011上的示範稿裡的圖: 

Joe Darcy 寫道

JDK、OpenJDK與HotSpot VM的版本 

Oracle/Sun JDK、OpenJDK與HotSpot VM的版本對應關系 

OpenJDK的其它發行版 

IcedTea 

UltraViolet™ Virtual Machine Development Kit 

-------------------------- 

OpenJDK源碼結構 

主項目 

引用自OpenJDK 8的README 

引用

The source code for the OpenJDK is delivered in a set of directories: hotspot, langtools, corba, jaxws, jaxp, and jdk. 

The hotspot directory contains the source code and make files for building the OpenJDK Hotspot Virtual Machine. 

The langtools directory contains the source code and make files for building the OpenJDK javac and language tools. 

The corba directory contains the source code and make files for building the OpenJDK Corba files. 

The jaxws directory contains the source code and make files for building the OpenJDK JAXWS files. 

The jaxp directory contains the source code and make files for building the OpenJDK JAXP files. 

The jdk directory contains the source code and make files for building the OpenJDK runtime libraries and misc files. 

The top level Makefile is used to build the entire OpenJDK.

---------------------------- 

編譯OpenJDK 

如何通過Mercurial下載下傳OpenJDK的源碼 

經驗帖: 

在XUbuntu 10.10上以JRL源碼建構Oracle JDK 6 update 23 

Oracle已經決定不再以JRL許可證釋出JDK 6的源碼,是以上面這篇經驗帖的許多内容變得沒用了。不過這帖裡也有寫了OpenJDK的build方法,其實很簡單的(取決于在什麼平台上…)。 

周志明(IcyFenix)寫的《深入了解Java虛拟機》一書的第一章,1.5小節介紹了在Windows上build出OpenJDK 7的步驟,也值得入門者參考。 

淘寶的同僚大仁的經驗帖:Ubuntu10.04下build OpenJDK7 的過程 

哪位大大編譯過OpenJDK6,請教些問題 

最新的OpenJDK 8裡有新的build infrastructure,編譯過程可能會有些變化。 

=========== 

真的要讀JVM的源碼麼? 

第0次JVM源碼閱讀活動讨論了“是不是真的要讀JVM源碼,要讀的話讀什麼,相關的推薦閱讀”的話題。 

具體内容請參考活動的示範稿:為啥别讀HotSpot VM的源碼 

特别推薦Maxine VM項目。 

最新的一篇綜述報告講解了Maxine VM的目标、高層架構、性能水準等。 

引用

A highly productive platform accelerates the production of research results. The design of a virtual machine (VM) written in the Java programming language can be simplified through exploitation of interfaces, type and memory safety, automated memory management (garbage collection), exception handling, and 

reflection. Moreover, modern Java IDEs offer time-saving features such as refactoring, auto-completion, and code navigation. Finally, Java annotations enable compiler extensions for low-level "systems programming" while retaining IDE compatibility. These techniques collectively make complex system software more "approachable" than has been typical in the past. 

The Maxine VM, a meta-circular Java VM implementation, has aggressively used these features since its inception. A co-designed companion tool, the Maxine Inspector, offers integrated debugging and visualization of all aspects of the VM\'s run-time state. The Inspector\'s implementation exploits advanced Java 

language features, embodies intimate knowledge of the VM\'s design, and even reuses a significant amount of VM code directly. These characteristics make Maxine a highly approachable VM research platform and a productive basis for research and teaching.

Maxine VM的其它相關文獻也都很值得一讀 

https://wikis.oracle.com/display/MaxineVM/Publications 

=========== 

閱讀HotSpot VM的源碼 

HotSpot VM的源碼結構 

簡記java launcher與HotSpot VM對VM參數的處理 

請教一個share/vm/oops下的代碼做fast subtype check的問題 

HotSpot中這麼多的Mutex Locker知多少 

[請教]hotspot的模闆解釋方法時如何将方法的指令串起來 

修改java.lang.String類時出錯? 

檢視HotSpot VM動态生成的機器碼 

HotSpot沒實作Megamorphic inline caching? 

關于OpenJDK1.7的javac源碼中JavaCompiler類的一點疑問 

請教ad檔案的格式 

=========== 

結合論文來閱讀源碼 

必讀資料 

HotSpot Internals for OpenJDK 

(該wiki遷移到了OpenJDK官網上。老的https://wikis.oracle.com/display/HotSpotInternals/Home已經改為隻讀模式) 

=========== 

郵件清單 

在OpenJDK官網左邊欄上面的Mailing Lists