首页 > 代码库 > 我为什么要自己编译openjdk8以及那些坑

我为什么要自己编译openjdk8以及那些坑

我为什么要自己编译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:35End   2016-10-02 16:15:2000:02:54 corba00:02:18 demos00:11:41 docs00:21:11 hotspot00:04:42 images00:01:32 jaxp00:02:00 jaxws00:17:21 jdk00:02:42 langtools00:01:13 nashorn01:07:45 TOTAL-------------------------

 

5. 运行结果

solidos@solidos-pc:~/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin$ ./java -versionopenjdk 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 javaGNU gdb (Ubuntu 7.7-0ubuntu3) 7.7Copyright (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 mainBreakpoint 1 at 0x4006dd: file /home/solidos/openjdk/jdk/src/share/bin/main.c, line 97.(gdb) r -classpath PossibleReorderingStarting 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:9797        const jboolean const_javaw = JNI_FALSE;(gdb) list92    int93    main(int argc, char **argv)94    {95        int margc;96        char** margv;97        const jboolean const_javaw = JNI_FALSE;98    #endif /* JAVAW */99    #ifdef _WIN32100        {101            int i = 0;(gdb) 

 

7. 结论

本文详细的列出了openjdk8编译的推荐环境和步骤,希望对有需要的人有所帮助,可以少走弯路..

 

我为什么要自己编译openjdk8以及那些坑