- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
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命令,检查是否配置都没问题了。如果没有问题就会显示 。
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命令重新来的时候,到最后一次 。
又成功了。所以遇到这种情况这种情况可以多次重来。最后一次内存就没有暴增了.
编译成功就是如下的样子了:
之后在build文件夹内就能找到你编译好的jdk.
谢谢大家,有什么不明了的可以向我提问.
以上这篇基于编译虚拟机jvm—openjdk的编译详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/abaoge/archive/2017/11/30/7932612.html 。
最后此篇关于基于编译虚拟机jvm—openjdk的编译详解的文章就讲到这里了,如果你想了解更多关于基于编译虚拟机jvm—openjdk的编译详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否有任何库或框架旨在促进从另一种成熟的编程语言中构建项目? 在 C++、java 等编程语言中指定逻辑、集合和复杂规则非常容易,但在 Makefile 中完成这些事情似乎是一场艰苦的战斗。我还没有深
我有这段代码可以用 clang 编译得很好(即使使用 -Weverything),但是 gcc 会发出错误。 #include #include #include using namespace
我有以下 block 头文件 BKE_mesh.h: /* Connectivity data */ typedef struct IndexNode { struct IndexNode *
我在我的一个项目中遇到了一个奇怪的问题。我的代码库依赖于一个外部库,其中包含一个名为 Dataset 的类. Dataset类私有(private)继承自 std::vector (其中 Sample
当使用 gcc、g++ 或 make 在终端中编译一个小型 C 或 C++ 项目时,我收到以下错误: /tmp/ccG1caGi.o: In function `main': main.c:(.tex
我正在尝试从 CVS 为 Windows 上的 Emacs 23.1.50 编译 CEDET,但在“第 6 步:打开 EDE...”时出现错误:“defvar:作为变量的符号值是无效的:cedet-m
我正在(重新)学习编程,我从 C 开始。我的 IDE(如果我可以这么说)是 Windows7 上的 cygwin(32 位)和 Visual-Studio 2010。我总是编译我用 gcc (cygw
我喜欢在模板类中使用本地类来执行类似“static if”的构造。但是我遇到了 gcc 4.8 不想编译我的代码的问题。但是 4.7 可以。 这个例子: #include #include #in
我有一个项目,必须仅使用 java 1.4 进行编译。但我计划使用mockito 编写一些单元测试。我想要一种在 pom 中指定的方法,以便 src/main/java 使用 jdk 1.4 编译,但
我想了解 PHP 编译过程是如何工作的。 假设我有一个名为funcs.php 的文件并且这个文件有三个函数,如果我include 或require 它,所有的在文件加载期间编译三个函数?或者源代码会被
编译工具链 我们写程序的时候用的都是集成开发环境 (IDE: Integrated Development Environment),集成开发环境可以极大地方便我们程序员编写程序,但是配置起来
当我编写一些 Scala 代码时,在尝试编译代码时收到一条奇怪的错误消息。我将代码分解为一个更简单的代码(从语义的角度来看这完全没有意义,但仍然显示了错误)。 scala> :paste // Ent
我正在编译一个 SCSS 文件,它似乎删除了我的评论。我可以使用什么命令来保留所有评论? >SASS input.scss output.css 我在 SCSS 中看到两种类型的注释。 // Comm
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
当您编译 grails war 时,我知道 .groovy 代码被编译为字节码类文件,但我不明白容器(例如 tomcat)如何在请求 GSP 时知道如何编译它们。容器了解 GSP 吗?安装在服务器上的
我正在努力将多个文件编译成一个通用程序。我收到一个错误: undefined reference to 'pi' 这是我的代码和 Makefile 的框架。我做错了什么?谢谢! 文件:calcPi.c
我尝试使用 LD_PRELOAD 来 Hook sprintf function ,所以我将打印到缓冲区的结果: #define _GNU_SOURCE #include #include int
我正在寻找最简单的方法来自动将 CoffeeScript 重新编译为 JS。 阅读documentation但仍然很难得到我想要的东西。 我需要它来监视文件夹 src/ 中的任何 *.coffee 文
我想使用定制waveformjs 。我发现this on SO但是,我不知道如何编译/安装波形来开始。我从 GitHub 克隆它并进行了更改,但是我不知道如何将其转换为 .js 文件。 最佳答案 为了
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!