Ubuntu 16.04下编译虚拟机JVM:OpenJDK的编译

Java只所以被推广,实际上很大原因是因为本身是跨平台的,很大作用是因为虚拟机的关系。一般情况下开发人员不需要关注虚拟机内部实现就可以日常开发了,但是有时候涉及到性能的时候就需要了解虚拟机的实现机制了。那么今天写的内容更多的是关于编译一套自己的虚拟机,为日后了解虚拟机底层原理铺铺路。

编译虚拟机可能会遇到很多坑,也很花费时间。也因大家的环境的差异,可能遇到的问题都不一致。

我只能说把自己遇到的问题都列出来,权当抛砖引玉了。

1、首先我们应该下载openjdk的源码,这个openjdk实际上是有一个版本历史的,大家可以去了解一下,然后这里面的源码内容和Oracle jdk内容大部分都是一致的,少数内容不一样。  

我这里下载的openjdk 源码是openjdk-7u75-src-b13-18_dec_2014.zip,每个人的版本可能不太一样,不过   是openjdk的源码就行。

2、除了上面的东西要准备,其实还要准备一个oracle的jdk,这个jdk我用的是jdk-6u32-linux-x64.bin。

3、然后是在linux上先准备好各种依赖,这些依赖获得方式待会儿会讲,另外要讲的是,我这里的linux系统是Ubuntu的 16.04 LTS 64位的,所以之前的东西也最好都准备64位的。

东西都准备好了,现在我们开干!!!!

1如果之前你设置了java_home或者classpath环境变量,请先注释掉。

2将openjdk-7u75-src-b13-18_dec_2014.zip解压后得到openjdk文件夹,我们把他放到/usr下。

3执行jdk-6u32-linux-x64.bin,得到jdk1.6.0_32文件夹,我们讲这个文件夹放到/usr/java下。

4输入vim /etc/profile,在最后加入如下内容:

export LANG=C #BootStrap-JDK的安装路径,替换为自己bootstrap-JDK的路径 export ALT_BOOTDIR=/usr/java/jdk1.6.0_32 #同上,我之前使用的是openjdk编译的,后面运行hotspot时出现问题替换为oracleJDK,读者可以直接替换为OracleJDK export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_32 #规定几个线程来执行这个脚本 export HOTSPOT_BUILD_JOBS=4 export ALT_PARALLEL_COMPILE_JOBS=4 #要编译的内容,读者可以根据需要自行选择 export BUILD_LANGTOOLS=true #export BUILD_JAXWS=false #export BUILD_JAXP=false #export BUILD_CORBA=false export BUILD_HOTSPOT=true export BUILD_JDK=true export SKIP_COMPARE_IMAGES=true BUILD_DEPLOY=false BUILD_INSTALL=false #编译结果存放的路径,建议存放在openjdk源码中build文件夹 export ALT_OUTPUTDIR=/usr/openjdk/build export ALLOW_DOWNLOADS=true #这两个环境变量需要去掉,不然会出问题 unset JAVA_HOME unset CLASSPATH make 2>&1 | tee $ALT_OUTPUTDIR/build.log 

注意的是需要source /etc/profile,以更新配置。但是输入后会马上跑起来,但是现在是不会成功的,因为依赖那些还没弄好。直接马上接着按ctrl+c以暂停。

5在终端执行一些命令以安装必要的依赖,命令如下:

sudo apt-get install build-essential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-common ant

有些地方还安装了openjdk-6-jdk,其实这里不安装这个更好,我们用的是oracle的jdk来编译我们的openjdk源码,不建议用openjdk-6-jdk来编译openjdk源码,那也正是我build.sh脚本里面指向的jdk地址是export ALT_BOOTDIR=/usr/java/jdk1.6.0_32的原因。

6现在我们到/usr/openjdk目录去执行make sanity命令,检查是否配置都没问题了。如果没有问题就会显示

Ubuntu 16.04下编译虚拟机JVM:OpenJDK的编译

7万事具备,只欠东风,输入make,开始编译,编译出的东西会生成在/usr/openjdk/build目录。

流程就是这样的,不过期间会出现一些问题,根据他报的错我们要修正一些错误,修正之后再继续make命令接着编译。

下面是我遇到的一些错误和解决办法。 

1>

echo "*** This OS is not supported:" `uname -a`; exit 1;

openjdk/hotspot/make/linux/Makefile:240: recipe for target 'check_os_version' failed

解决:

将/openjdk/hotspot/make/linux/Makefile中的check_os_version下面三行注释掉

check_os_version:
#ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)
# $(QUIETLY) >&2 echo "*** This OS is not supported:" `uname -a`; exit 1;
#endif

2>

undefined reference to `void G1SATBCardTableModRefBS::write_ref_array_pre_work<oopDesc*>(oopDesc**, int)'

解决:将hotspot/src/share/vm/gc_implementation/g1里的g1SATBCardTableModRefBS.cpp

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13194.html