《深刻理解Java虛擬機》第二版第一章實踐html
sudo apt-get install mercurial
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev cd jdk7u-dev chmod 755 get_source.sh ./get_source.sh
當前的jdk7u-dev
大小爲756MB
要是對本身的網速沒有信心,也能夠選擇在雲服務器上先下載好,而後進行壓縮,再傳輸至本地,實測壓縮後僅有250MB
左右java
sudo apt-get install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant
openjdk-6-jdk
是不能直接apt-get
的,google之後Github-bmaupin給出了一個解決方案,咱們能夠直接去到http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html
,選擇合適的包下載。下載前還須要註冊一個Oracle賬號。下載好jdk-6u45-linux-x64.bin
後複製到想要的目錄並運行,相同目錄下就會建立一個包含有jdk的文件夾。libmotif3
也不能直接安裝,須要從https://launchpad.net/ubuntu/xenial/amd64/libmotif3/2.3.4-8ubuntu1
下載environment.sh
見最後,輸入source environment.sh
,而後make sanity
檢查Sanity check passed
,則證實檢查經過,能夠進行make了make 2>&1 | tee $ALT_OUTPUTDIR/build.log
進行編譯#-- Build times ---------- Target all_product_build Start 2017-10-19 23:38:57 End 2017-10-19 23:53:03 00:00:11 corba 00:01:06 hotspot 00:00:02 jaxp 00:00:04 jaxws 00:12:41 jdk 00:00:02 langtools 00:14:06 TOTAL -------------------------
OpenJDK目錄/hotspot/make
,複製environment.sh
,依次運行source environment.sh
,make
environment.sh
export ARCH_DATA_MODEL=64
,不然會在編譯過程當中提示部分頭文件找不到build
下面,比較難分辨linux_amd64_compiler2/fastdebuf
下修改env.sh
,添加LD_LIBRART_PATH=.:{JAVA_HOME}/jre/lib/amd64/native_threads:%{JAVA_HOME}/jre/lib/amd64: export LD_LIBRARY_PATH
而後依次運行source env.sh
,./gamma -version
,若是編譯成功,就能看到結果。linux
- Pre-Build Action: 此處輸入的命令應爲
./environment.sh
- Build-Action: 此處
Build Command
應該是${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=environment.sh中的ALT_BOOTDIR ARCH_DATA_MODEL=64 LANG=C
OpenJDK目錄/hotspot/build/linux/linux_amd64_compiler2/jvmg
下。This OS is not supported
,可使用這個方法:gamma
相關的錯誤,參見這裏的編譯錯誤一進入
hotspot/src/share/vm/gc_implementation/g1
修改g1SATBCardTableModRefBS.cpp
修改內容以下(67行開始):git
template <class T> void G1SATBCardTableModRefBS::write_ref_array_pre_work(T* dst, int count) { if (!JavaThread::satb_mark_queue_set().is_active()) return; T* elem_ptr = dst; for (int i = 0; i < count; i++, elem_ptr++) { T heap_oop = oopDesc::load_heap_oop(elem_ptr); if (!oopDesc::is_null(heap_oop)) { enqueue(oopDesc::decode_heap_oop_not_null(heap_oop)); } } } //2017-10-19 Vicent_Chen added void G1SATBCardTableModRefBS::write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } void G1SATBCardTableModRefBS::write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } //2017-10-19 Vicent_Chen added
修改
g1SATBCardTableModRefBS.hpp
修改內容以下:(87行開始)github
template <class T> void write_ref_array_pre_work(T* dst, int count); // 2017-10-19 Vicent_Chen modified /* virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } */ virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized); virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_unintialized); // 2017-10-19 Vicent_Chen modified
編譯完成後Ubuntu的圖形界面會有點卡,懷疑是內存泄漏,建議重啓ubuntu
#!/bin/sh # environment.sh # 語言選項,若不設置則會在編譯好後出現一個HashTable的NPE錯 export LANG=C # Bootstrap JDK的安裝路徑 export ALT_BOOTDIR=#JDK安裝路徑(上文提到的Oracel JDK安裝路徑) # 容許自動下載依賴 export ALLOW_DOWNLOADS=true # 並行編譯線程數,設置爲和CPU內核數同樣便可 export HOTSPOT_BUILD_JOBS=4 export ALT_PARALLEL_COMPILE_JOBS=4 # 比較本次build出來的映像與先前版本的差別。這對咱們來講沒有意義 # 必須設置爲false,不然sanity檢查會報缺乏先前版本JDK的映像的錯誤提示 # 若是已經設置 dev 或者 DEV_ONLY = true,這個不顯式設置也行 export SKIP_COMPARE_IMAGES=true # 使用預編譯頭文件,不加這個編譯會慢些 export USE_PRECOMPILED_HEADER=true # 要編譯的內容 export BUILD_LANGTOOLS=true #export BUILD_JAXP=false #export BUILD_JAXWS=false #export BUILD_CORBA=false export BUILD_HOTSPORT=true export BUILD_JDK=true # 要編譯的版本 # export SKIP_DEBUG_BUILD=false # export SKIP_FASTDEBUG_BUILD=true # export DEBUG_NAME=debug # 把它設置爲false能夠避開javaws和瀏覽器Java插件之類的部分的build BUILD_DEPLOY=false # 把它設置爲false就不會build出安裝包,由於安裝包裏有奇怪的依賴項 # 但即使不build出它也已經能獲得完整的JDK映像,因此仍是不build BUILD_INSTALL=false # 編譯結果存放路徑 export ALT_OUTPUTDIR= #openjdk7 路徑/build # 這兩個環境變量必須去掉,不然會有奇怪的事情發生 unset JAVA_HOME unset CLASSPATH # 這個環境變量是make sanity建議消除的 unset LD_LIBRARY_PATH