gpt4 book ai didi

基于编译虚拟机jvm—openjdk的编译详解

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章基于编译虚拟机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.04lts 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,在最后加入如下内容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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命令,检查是否配置都没问题了。如果没有问题就会显示 。

基于编译虚拟机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 。

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 。

将hotspot/src/share/vm/gc_implementation/g1里的g1satbcardtablemodrefbs.hpp如下部分 。

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),

  。

3> 。

error: time is more than 10 years from present: 1136059200000 。

解决:

openjdk/jdk/src/share/classes/java/util/currencydata.properties文件中以下时间改成10年以内 。

az=azm;2005-12-31-20-00-00;azn 。

mz=mzm;2006-06-30-22-00-00;mzn ro=rol;2005-06-30-21-00-00;ron 。

tr=trl;2004-12-31-22-00-00;try 。

ve=veb;2008-01-01-04-00-00;vef 。

4>之后可能在编译rmiserverimpl_stub.class的时候,很可能是内存不够了,因为我通过系统监视器观察得到这段时间内内存在暴增,具体原因也不知道,但是我连续几次在make命令重新来的时候,到最后一次 。

又成功了。所以遇到这种情况这种情况可以多次重来。最后一次内存就没有暴增了.

编译成功就是如下的样子了:

基于编译虚拟机jvm—openjdk的编译详解

之后在build文件夹内就能找到你编译好的jdk.

谢谢大家,有什么不明了的可以向我提问.

以上这篇基于编译虚拟机jvm—openjdk的编译详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.

原文链接:http://www.cnblogs.com/abaoge/archive/2017/11/30/7932612.html 。

最后此篇关于基于编译虚拟机jvm—openjdk的编译详解的文章就讲到这里了,如果你想了解更多关于基于编译虚拟机jvm—openjdk的编译详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com