我為什么要自己編譯openjdk8以及那些坑
這是筆者第二次編譯openjdk, 第一次編譯的是openjdk7,那么好多人會好奇,為什么要自己編譯openjdk呢,官方不是已經發布了安裝包了么?
要回答這個問題就要明白c\c++是什么?Java又是什么?
記得有位業內同行說過,C++和Java之間隔着一堵由內存管理圍成的牆,里面的人想出去,外面的人想進來。筆者從業多年確實見過不少內存管理高手,但是還是有一部分朋友是不喜歡內存管理的,但是如果想成為C++大牛,這關恐怕繞不過去。筆者第一次編譯openjdk時候的想法很簡單,就是打破這堵牆,如果連openjdk也是我自己編譯的,那么就都是我C++的天下,可以任意調試,無所不能。由於時間的原因,第一次利用openjdk編譯,我只研究了Java垃圾回收機制也就是GC相關的內容,后來工作太忙就沒來得及自己研究其余的部分。今天終於有些時間,於是泡了一杯黃山毛峰,開始了下面的故事。下面我們來說說openjdk8的編譯,和openjdk7的編譯過程還是稍有區別的。
1. openjdk8代碼構成
C\C++\Java, 不要問我為什么openjdk代碼里面為什么還有Java, 這是一個雞生蛋還是蛋生雞的死循環..
2. 選擇什么環境編譯openjdk8
可供選擇的環境按照OS分為三種,第一種是Windows, 由於openjdk8編譯需要linux工具鏈,所以需要同時配置MingW比較復雜,第二種是Mac OSX, 由於openjdk8的編譯需要借助xcode,而更麻煩的是需要老版本的xcode,不推薦,第三種就是Linux 但是需要選對版本,否則還是出問題,比如ubuntu2014和openjdk8就更配,如果用ubuntu2016就需要用hg下載最新的開發版代碼,一共將近1g的單個文件,還不壓縮,如果網速不行,恐怕得下載幾天。筆者最終選擇的是ubuntu2014和openjdk8無更新版本。
3. 編譯過程詳解
<1>下載openjdk-8-src-b132-03_mar_2014.zip,官網下載就成,如果網速不行,就找找工具可以事半功倍。
<2>筆者用了虛擬機VirtualBox,然后在VirtualBox里面裝了一個ubuntu2014,最開始用的ubuntu2016由於和openjdk8氣場不和,又裝了一個ubuntu2014,如果真想用ubuntu2016,代碼需要用hg拉最新的開發分支,網速不行的慎重。
<3>sudo mount -t vboxsf SHare /media/sf_SHare將共享文件夾在ubuntu2014里面掛載一下,否則共享文件夾在ubuntu2014里面看不到。
<4>sudo bash configure 安裝所有提示的安裝包用apt-get install。
<5>sudo bash configure --with-debug-level=slowdebug。
<6>sudo make all CONF=linux-x86_64-normal-server-slowdebug
4. 編譯結果
----- Build times ------- Start 2016-10-02 15:07:35 End 2016-10-02 16:15:20 00:02:54 corba 00:02:18 demos 00:11:41 docs 00:21:11 hotspot 00:04:42 images 00:01:32 jaxp 00:02:00 jaxws 00:17:21 jdk 00:02:42 langtools 00:01:13 nashorn 01:07:45 TOTAL -------------------------
5. 運行結果
solidos@solidos-pc:~/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin$ ./java -version openjdk version "1.8.0-internal-debug" OpenJDK Runtime Environment (build 1.8.0-internal-debug-root_2016_10_02_15_06-b00) OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)
6.GDB調試結果
solidos@solidos-pc:~/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin$ gdb java GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7 Copyright (C) 2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from java...done. (gdb) b main Breakpoint 1 at 0x4006dd: file /home/solidos/openjdk/jdk/src/share/bin/main.c, line 97. (gdb) r -classpath PossibleReordering Starting program: /home/solidos/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -classpath PossibleReordering [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Breakpoint 1, main (argc=3, argv=0x7fffffffdde8) at /home/solidos/openjdk/jdk/src/share/bin/main.c:97 97 const jboolean const_javaw = JNI_FALSE; (gdb) list 92 int 93 main(int argc, char **argv) 94 { 95 int margc; 96 char** margv; 97 const jboolean const_javaw = JNI_FALSE; 98 #endif /* JAVAW */ 99 #ifdef _WIN32 100 { 101 int i = 0; (gdb)
7. 結論
本文詳細的列出了openjdk8編譯的推薦環境和步驟,希望對有需要的人有所幫助,可以少走彎路..