《深入理解Java虚拟机》第二版第一章实践

准备

  • Mercurial sudo apt-get install mercurial
  • OpenJDK7
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
cd jdk7u-dev
chmod 755 get_source.sh
./get_source.sh

当前的jdk7u-dev 大小为756MB

要是对自己的网速没有信心,也可以选择在云服务器上先下载好,然后进行压缩,再传输至本地,实测压缩后仅有250MB左右

编译过程

依赖

  • sudo apt-get install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant

    其中,openjdk-6-jdk 是不能直接apt-get 的,google以后Github-bmaupin给出了一个解决方案,我们可以直接去到http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html,选择合适的包下载。下载前还需要注册一个Oracle帐号。下载好jdk-6u45-linux-x64.bin后复制到想要的目录并运行,相同目录下就会创建一个包含有jdk的文件夹。

    libmotif3也不能直接安装,需要从https://launchpad.net/ubuntu/xenial/amd64/libmotif3/2.3.4-8ubuntu1下载
  • 环境变量设置 environment.sh见最后,输入source environment.sh,然后make sanity检查

    如果输出是Sanity check passed,则证明检查通过,可以进行make了

编译

  • 输入make 2>&1 | tee $ALT_OUTPUTDIR/build.log进行编译
  • 若出现以下信息,则证明编译成功
#-- Build times ----------
Target all_product_build
Start 2017-10-19 23:38:57
End 2017-10-19 23:53:03
00:00:11 corba
00:01:06 hotspot
00:00:02 jaxp
00:00:04 jaxws
00:12:41 jdk
00:00:02 langtools
00:14:06 TOTAL
-------------------------

Hotspot

  • 进入OpenJDK目录/hotspot/make,复制environment.sh,依次运行source environment.shmake
  • Hotspot的编译与JDK的编译大体相似,但还是有所不同,主要修改的还是environment.sh
  • 如果是64位系统,在最后加上export ARCH_DATA_MODEL=64,否则会在编译过程中提示部分头文件找不到
  • 编译的输出路径建议进行修改,不然jdk与hotspot的编译输出都会放在build下面,比较难分辨
  • 编译完成后可以去linux_amd64_compiler2/fastdebuf下修改env.sh,添加
LD_LIBRART_PATH=.:{JAVA_HOME}/jre/lib/amd64/native_threads:%{JAVA_HOME}/jre/lib/amd64:
export LD_LIBRARY_PATH

然后依次运行source env.sh./gamma -version,如果编译成功,就能看到结果。

Netbeans

  • 去到Netbeans官网下载最新版本并安装
  • Netbeans 源码调试教程
  • 该教程中有些地方与本文的介绍不太合适,这里是更正:
  1. Pre-Build Action: 此处输入的命令应为./environment.sh
  2. Build-Action: 此处Build Command应该是${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=environment.sh中的ALT_BOOTDIR ARCH_DATA_MODEL=64 LANG=C
  • Netbeans下编译好的文件将会存放在OpenJDK目录/hotspot/build/linux/linux_amd64_compiler2/jvmg下。

错误

进入hotspot/src/share/vm/gc_implementation/g1

修改g1SATBCardTableModRefBS.cpp 修改内容如下(67行开始):

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

修改g1SATBCardTableModRefBS.hpp 修改内容如下:(87行开始)

  template <class T> void write_ref_array_pre_work(T* dst, int count);
// 2017-10-19 Vicent_Chen modified
/*
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);
// 2017-10-19 Vicent_Chen modified

编译后

编译完成后Ubuntu的图形界面会有点卡,怀疑是内存泄漏,建议重启

#!/bin/sh
# environment.sh # 语言选项,若不设置则会在编译好后出现一个HashTable的NPE错
export LANG=C
# Bootstrap JDK的安装路径
export ALT_BOOTDIR=#JDK安装路径(上文提到的Oracel JDK安装路径)
# 允许自动下载依赖
export ALLOW_DOWNLOADS=true
# 并行编译线程数,设置为和CPU内核数一样即可
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4 # 比较本次build出来的映像与先前版本的差异。这对我们来说没有意义
# 必须设置为false,否则sanity检查会报缺少先前版本JDK的映像的错误提示
# 如果已经设置 dev 或者 DEV_ONLY = true,这个不显式设置也行
export SKIP_COMPARE_IMAGES=true # 使用预编译头文件,不加这个编译会慢些
export USE_PRECOMPILED_HEADER=true # 要编译的内容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPORT=true
export BUILD_JDK=true # 要编译的版本
# export SKIP_DEBUG_BUILD=false
# export SKIP_FASTDEBUG_BUILD=true
# export DEBUG_NAME=debug # 把它设置为false可以避开javaws和浏览器Java插件之类的部分的build
BUILD_DEPLOY=false # 把它设置为false就不会build出安装包,因为安装包里有奇怪的依赖项
# 但即便不build出它也已经能得到完整的JDK映像,所以还是不build
BUILD_INSTALL=false # 编译结果存放路径
export ALT_OUTPUTDIR= #openjdk7 路径/build # 这两个环境变量必须去掉,否则会有奇怪的事情发生
unset JAVA_HOME
unset CLASSPATH # 这个环境变量是make sanity建议消除的
unset LD_LIBRARY_PATH

Ubuntu16.04 编译 OpenJDK7的更多相关文章

  1. Ubuntu16.04编译安装php

    #Ubuntu16.04编译安装php Ubuntu16.04上面搭建基于Nginx的php服务.Nginx使用apt直接安装的. sudo apt install nginx php的安装部署步骤主 ...

  2. Ubuntu16.04编译Android6.0/cm13.0教程及相关错误解决办法

    一.必备工作 1.安装依赖库 sudo apt--dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zl ...

  3. ubuntu16.04编译安装mysql-boost-5.7.21并编译成php扩展测试与使用

    我之前的文章已经改造了自定义MVC框架中的工具类(验证码,图片上传,图像处理,分类)4个类,接下来,就要改造模型类,模型类肯定要连接数据库,由于我的Ubuntu Linux是裸装的php(目前只编译了 ...

  4. Ubuntu16.04编译安装tensorflow,2018最新血泪踩坑之后的全面总结!绝对成功!【转】

    本文转载自:https://blog.csdn.net/pzh11001/article/details/79683133 大家好,我是 (深度学习硬件DIY总群)(719577294)群主:    ...

  5. ubuntu16.04编译QT5.6所依赖的库

    首先在QT的根目录下,阅读README文件! 里面介绍了ubuntu环境下,编译该版本的QT需要安装的包 New dependencies in Qt 5    ------------------- ...

  6. Ubuntu16.04编译tensorflow的C++接口

    原文:https://www.bearoom.xyz/2018/09/27/ubuntu1604buildtf4cpp/ 之前有一篇介绍到在windows下利用VS2015编译tensorflow的C ...

  7. Ubuntu16.04编译libjpeg-turbo库

    一.环境依赖 CMake v2.8.12或以后 NASM or YASM (if building x86 or x86-64 SIMD extensions),如果使用NASM, 依赖2.10之后版 ...

  8. Ubuntu16.04编译Openjdk8,笔者亲测编译成功

    现在很多语言都不开发运行环境了,都选择在JRE上运行,足以证明JVM的优越.你精通了JVM,未来的路才可能走得轻松.这篇文章是你走近jvm的第一篇,编译Openjdk8源码 编译环境 操作系统:Ubu ...

  9. ORB_SLAM2 Ubuntu16.04编译错误

    Ubuntu14.04一切正常,迁移到Ubuntu16.04后编译报错,提示: /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:745:3: ...

随机推荐

  1. PTA题---求两个有序序列中位数所体现的思想。

    ---恢复内容开始--- 近日,在做PTA题目时,遇到了一个这样的题,困扰了很久.题目如下:已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A​0​​,A​1​​, ...

  2. Solr7使用Oracle数据源导入+中文分词

    安装目录假设为#solr_home,本文的#solr_home为apps/svr/solr 1. 在#solr_home/server/solr下新建文件夹,假设为mjd 2. 将#solr_home ...

  3. Jarvis OJ- [XMAN]level2/3_x64-Writeup——64位简单栈溢出

    两道64位栈溢出,思路和之前的32位溢出基本一致,所以放在一起 在这两道中体现的32位和64位的主要区别在于函数参数传递的方式 在32位程序运行中,函数参数直接压入栈中 调用函数时栈的结构为:调用函数 ...

  4. nginx防恶意域名解析

    今天无意间查看访问日志发现一个fhxywh.com的域名居然解析到了我的服务器,也就是说通过这个域名也能访问我的博客,这个就是赤裸裸的恶意域名解析了. 这个危害非常大,不仅会影响用户,而且不利于SEO ...

  5. 用maven搭建java ee项目

    一.开发环境 jdk1.7  tomcat7 eclipse-jee-luna-R-win32 maven2.2.1 二搭建步骤 1.点击File->New->Other,选择maven ...

  6. 负载均衡之基于L7负载

    L7负载平衡 还有一种较为经常使用的负载平衡解决方式则是L7负载平衡.顾名思义,其主要通过OSI模型中的第七层应用层中的数据决定怎样分发负载. 在执行时.L7负载平衡server上的操作系统会将接收到 ...

  7. 快速上手virtualenv

    五分钟轻松学会管理项目开发环境. 在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.x.所有第三方的包都会被pip安装到Python3的site-packages目录下. p ...

  8. [UWP]本地化入门

    1. 前言 上一篇文章介绍了各种WPF本地化的入门知识,这篇文章介绍UWP本地化的入门知识. 2. 使用resw资源文件实现本地化 在以前的XAML平台,resx资源文件是一种很方便的本地化方案,但在 ...

  9. SpringMVC实现JSON与前台交互

    这几天忙着做学校的项目,感觉好久没有更新博客了,来整理一下. 由于要实现的功能是表单联动,只能自己去写ajax来实现提交给后台接口了,好久没有写前端,好多东西都忘记了,只能可怜巴巴的用原生的js去实现 ...

  10. MyBatis:lazy loading

    懒加载的原理 mybatis 会循环处理结果集中返回的每行数据的,在处理之前首先会通过反射调用构造方法来创建 result 对象,结果集中的一行数据最终会映射为一个 result 对象(严格的来说是不 ...