深入理解JVM虚拟机 - 自我编译JDK
《深入理解JVM虚拟机》看过了好几遍了,对于编译一个JDK源码有很强的冲动。这里主要实战使用阿里云进行编译实战

为什么使用阿里云?

个人电脑奋斗四年了,装虚拟机莫名其妙的死机
阿里云带宽1M,只能用来干些LInux学习的工作
参考博客:https://juejin.im/post/5c6b9a476fb9a049c30bcebd

JDK源码下载 - openJDK7u75
地址:https://download.java.net/openjdk/jdk7u75/ri/openjdk-7u75-src-b13-18_dec_2014.zip
Bootstrap JDK
编译OpenJDK7需要 Bootstrap JDK U14 之后的版本
地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
下载linux.tag.gz包
有条件尽量科学上网下载比较慢
阿帕奇蚂蚁 1.7.1版本
地址:https://ant.apache.org/bindownload.cgi

还需要一个apach ant 1.7.1 版本

这里选择了: 1.9.14版本

前置依赖:
OpenJDK要用到很多的gcc,java,c的库函数,需要进行前置准备

yum -y install build-essential gawk m4 openjdk6-jdk libasound2-print-dev binutils libmotif3 libmotif-dev ant
yum install libX* #有可能会缺失的库,先提前安装
首次编译
# 进入到openjdk的目录
cd openjdk所在目录
# 解压
unzip openjdk
# 编译
cd open jdk
# 第一次编译,输出到对应文件make sanity > error.txt

不出所料,编译失败了,我们可以根据错误日志来进行调整

根据错误,整理一下错误点

下面参考书籍的内容进行设置

设置环境变量
gcc 4.3 版本以上

必须设置两个

LANG:编译语言
ALT_BOOTDIR:Bootstrap JDK 1.7 的版本
设置环境变量

export LANG=C
export ALT_BOOTDIR=/usr/local/software/openjdk/jdk1.7.0_80

去掉原本的JDK环境变量

unset JAVA_HOME
unset CLASSPATH
OpenJDK

OpenJDK错误处理
错误1: 缺少打印
错误信息

ERROR: You do not have access to valid Cups header files. Please check your access to /usr/include/cups/cups.h and/or check your value of ALT_CUPS_HEADERS_PATH, CUPS is frequently pre-installed on many systems, or may be downloaded from http://www.cups.org

处理方式:

缺少打印框架,解决:cups

可以根据如下命令查找
yum search cups查找对应依赖

=========================================== N/S matched: cups ============================================
apcupsd-cgi.x86_64 : Web interface for apcupsd
apcupsd-gui.x86_64 : GUI interface for apcupsd
bluez-cups.x86_64 : CUPS printer backend for Bluetooth printers
cups.x86_64 : CUPS printing system
cups-bjnp.x86_64 : CUPS backend for the Canon BJNP network printers
cups-client.x86_64 : CUPS printing system - client programs
cups-devel.i686 : CUPS printing system - development environment
cups-devel.x86_64 : CUPS printing system - development environment
cups-filesystem.noarch : CUPS printing system - directory layout
cups-filters.x86_64 : OpenPrinting CUPS filters and backends
cups-filters-devel.i686 : OpenPrinting CUPS filters and backends - development environment
cups-filters-devel.x86_64 : OpenPrinting CUPS filters and backends - development environment
cups-filters-libs.i686 : OpenPrinting CUPS filters and backends - cupsfilters and fontembed libraries
cups-filters-libs.x86_64 : OpenPrinting CUPS filters and backends - cupsfilters and fontembed libraries
cups-ipptool.x86_64 : CUPS printing system - tool for performing IPP requests
cups-libs.x86_64 : CUPS printing system - libraries
cups-libs.i686 : CUPS printing system - libraries
cups-lpd.x86_64 : CUPS printing system - lpd emulation
cups-pdf.x86_64 : Extension for creating pdf-Files with CUPS
cups-x2go.noarch : CUPS backend for printing from X2Go
dymo-cups-drivers.x86_64 : DYMO LabelWriter Drivers for CUPS
ghostscript-cups.x86_64 : CUPS filter for interpreting PostScript and PDF
gutenprint-cups.x86_64 : CUPS drivers for Canon, Epson, HP and compatible printers
perl-Net-CUPS.x86_64 : Perl bindings to the CUPS C API Interface
python-cups.x86_64 : Python bindings for CUPS
python-cups-doc.x86_64 : Documentation for python-cups
python3-cups-doc.x86_64 : Documentation for python-cups
python34-cups.x86_64 : Python 3 bindings for CUPS API, known as pycups
python36-cups.x86_64 : Python 3 bindings for CUPS API, known as pycups
apcupsd.x86_64 : APC UPS Power Control Daemon
cups-pk-helper.x86_64 : A helper that makes system-config-printer use PolicyKit
foomatic-filters.x86_64 : CUPS print filters for the foomatic package
samba-krb5-printing.x86_64 : Samba CUPS backend for printing with KerberosName and summary matches only, use "search all" for everything.

安装杯子

yum install cups-devel.x86_64

错误2: 缺少 Freetype 依赖
报错情况:

ERROR: FreeType version  2.3.0  or higher is required. make[2]: 进入目录“/usr/local/software/openjdk/jdk/make/tools/freetypecheck”
/bin/mkdir -p /usr/local/software/openjdk/build/linux-amd64/btbins
rm -f /usr/local/software/openjdk/build/linux-amd64/btbins/freetype_versioncheck
make[2]: 离开目录“/usr/local/software/openjdk/jdk/make/tools/freetypecheck”
Failed to build freetypecheck.

处理方式:

1.yum search freetype
========================================= N/S matched: freetype ==========================================
freetype-demos.x86_64 : A collection of FreeType demos
freetype-devel.i686 : FreeType development libraries and header files
freetype-devel.x86_64 : FreeType development libraries and header files
mingw32-freetype-static.noarch : Static version of the MinGW Windows Freetype library
mingw64-freetype-static.noarch : Static version of the MinGW Windows Freetype library
python-freetype.noarch : Freetype python bindings
freetype.x86_64 : A free and portable font rendering engine
freetype.i686 : A free and portable font rendering engine
ftgl.x86_64 : OpenGL frontend to Freetype 2
mingw32-freetype.noarch : Free and portable font rendering engine
mingw64-freetype.noarch : Free and portable font rendering engine
2.执行命令yum install freetype-devel.x86_64 -y

错误3:缺少声卡Alsa依赖,需要安装
错误信息

ERROR: You seem to not have installed ALSA 0.9.1 or higher. Please install ALSA (drivers and lib). You can download the source distribution from http://www.alsa-project.org or go to http://www.freshrpms.net/docs/alsa/ for precompiled RPM packages.

处理方式:

1.yum search alsa
 * updates: mirrors.aliyun.com
======================================== N/S matched: alsa ========================================
alsa-firmware.noarch : Firmware for several ALSA-supported sound cards
alsa-lib.x86_64 : The Advanced Linux Sound Architecture (ALSA) library
alsa-lib.i686 : The Advanced Linux Sound Architecture (ALSA) library
alsa-lib-devel.i686 : Development files from the ALSA library
alsa-lib-devel.x86_64 : Development files from the ALSA library
alsa-plugins-arcamav.i686 : Arcam AV amplifier plugin for ALSA
alsa-plugins-arcamav.x86_64 : Arcam AV amplifier plugin for ALSA
alsa-plugins-maemo.i686 : Maemo plugin for ALSA
alsa-plugins-maemo.x86_64 : Maemo plugin for ALSA
alsa-plugins-oss.i686 : Oss PCM output plugin for ALSA
alsa-plugins-oss.x86_64 : Oss PCM output plugin for ALSA
alsa-plugins-pulseaudio.i686 : Alsa to PulseAudio backend
alsa-plugins-pulseaudio.x86_64 : Alsa to PulseAudio backend
alsa-plugins-samplerate.i686 : External rate converter plugin for ALSA
alsa-plugins-samplerate.x86_64 : External rate converter plugin for ALSA
alsa-plugins-upmix.i686 : Upmixer channel expander plugin for ALSA
alsa-plugins-upmix.x86_64 : Upmixer channel expander plugin for ALSA
alsa-plugins-usbstream.i686 : USB stream plugin for ALSA
alsa-plugins-usbstream.x86_64 : USB stream plugin for ALSA
alsa-plugins-vdownmix.i686 : Downmixer to stereo plugin for ALSA
alsa-plugins-vdownmix.x86_64 : Downmixer to stereo plugin for ALSA
alsa-tools.x86_64 : Specialist tools for ALSA
alsa-tools-firmware.x86_64 : ALSA tools for uploading firmware to some soundcards
alsa-utils.x86_64 : Advanced Linux Sound Architecture (ALSA) utilities
alsa-plugins-speex.i686 : Rate Converter Plugin Using Speex Resampler
alsa-plugins-speex.x86_64 : Rate Converter Plugin Using Speex Resampler
2.安装依赖:yum -y install alsa-lib* alsa-util

错误4:缺少Ant依赖

ERROR: The version of ant being used is older than the required version of '1.7.1'. The version of ant found was ''.

处理方式:

yum install ant -y
错误5:缺少C语言环境变量
错误信息
WARNING: LANG has been set to zh_CN.UTF-8, this can cause build failures. Try setting LANG to 'C'.

处理方式:

export LANG=C设置C语言环境

第二次编译
需要再次输入命令 ,知道看到如下信息make santify

复制代码 隐藏代码
Sanity check passed.
编写启动脚本
经过上面的测试,再根据JVM虚拟机的内容,编写了下面一个通用的命令脚本

#!/bin/bash
# 语言选项,必须设置,否者编译之后会出现一个HashTable槽的错误的NPE的错
export LANG=C
# Bootstrap JDK 的安装路径
export ALT_BOOTDIR=/usr/local/software/openjdk/jdk1.7.0_80
# 允许自动下载数据
export ALLOW_DOWNLOADS=true
#并行编译的线程数,设置为和CPU内核数量一致即可export HOTSPOT_BUILD_JOBS=6export ALT_PARALLEL_COMPILE_JOBS=6#比较本次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=falseexport BUILD_HOTSPOT=trueexport BUILD_JDK=true#要编译的版本#export SKIP_DEBUG_BUILD=false#export SKIP_FASTDEBUG_BUILD=true#export DEBUG_NAME=debug#把它设置为false可以避开javaws和浏览器Java插件之类的部分的buildBUILD_DEPLOY=false#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,#但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了BUILD_INSTALL=false#编译结果所存放的路径export ALT_OUTPUTDIR=/Users/IcyFenix/Develop/JVM/jdkBuild/openjdk_7u4/build#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些"诡异的
#事情",Makefile脚本检查到有这2个变量就会提示警告)unset JAVA_HOMEunset CLASSPATHmake 2>&1|tee $ALT_OUTPUTDIR/build.log

启动脚本参考:

#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
export LANG=C#Bootstrap JDK的安装路径。必须设置。
export ALT_BOOTDIR=/usr/local/java/jdk1.7.0_04#允许自动下载依赖
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_HOTSPOT=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#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些“”诡异的事情”,Makefile脚本检查到有这2个变量就会提示警告“)
unset JAVA_HOME
unset CLASSPATHmake 2>&1 | tee $ALT_OUTPUTDIR/build.log

个人版本:

export LANG=C
export ALT_BOOTDIR=/usr/local/software/jdk1.7
export ALLOW_DOWNLOADS=true
export HOTSPOT_BUILD_JOBDS=1
export ALT_PARALLEL_COMPILE_JOBS=1
export SKIP_COMPARE_IMAGES=true
export USE_PRECOMPLIED_HEADER=true
export BUILD_LANGTOOLS=true
export BUILD_JAXP=false
export BUILD_JAXWS=false
export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=trueexport SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debugBUILD_DEPLOY=false
BUILD_INSTALL=falseunset JAVA_HOME
unset CLASSPATHmake 2>&1 | tee /usr/local/software/build.log
开始编译
使用上一节写好的脚本运行下面的命令chmod +x run.sh
./run.sh

经过多次尝试,现在出现如下报错:

g++: internal compiler error: Killed (program cc1plus)

处理方式

内存不足,需要扩充内存
问题收集:

  1. 编译过程突然报错,报错信息如下
g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make[7]: *** [ad_x86_64.o] Error 4
make[7]: Leaving directory `/usr/local/software/openjdk/build/linux-amd64-debug/hotspot/outputdir/linux_amd64_compiler2/jvmg'
make[6]: *** [the_vm] Error 2
make[6]: Leaving directory `/usr/local/software/openjdk/build/linux-amd64-debug/hotspot/outputdir/linux_amd64_compiler2/jvmg'
make[5]: *** [jvmg] Error 2
make[5]: Leaving directory `/usr/local/software/openjdk/build/linux-amd64-debug/hotspot/outputdir'
make[4]: *** [generic_build2] Error 2
make[4]: Leaving directory `/usr/local/software/openjdk/hotspot/make'
make[3]: *** [jvmg] Error 2
make[3]: Leaving directory `/usr/local/software/openjdk/hotspot/make'
make[2]: *** [hotspot-build] Error 2
make[2]: Leaving directory `/usr/local/software/openjdk'
make[1]: *** [generic_debug_build] Error 2
make[1]: Leaving directory `/usr/local/software/openjdk'
make: *** [build_debug_image] Error 2

分析原因:

可能是阿里云买的最低配,导致编译的时候内存爆了
Bootstrap JDK版本和书本的不一致,尝试按照书本一模一样的方式处理
脚本建议手敲,复制黏贴容易错误
参考资料:
https://blog.csdn.net/zitong_ccnu/article/details/50149757CenterOS7 编译OpenJDK7

https://www.bbsmax.com/A/GBJrKLa50e/案例2

https://hllvm-group.iteye.com/group/topic/35803JVM的一些讨论,值得看看

处理问题的几个套路
套路一:缺少依赖,却不知道安装的具体内容
当提示缺少依赖,而你不知道要什么时,你可以根据提示关键字搜一下,然后在搜出的结果列表中,对有着相同前缀的依赖使用后缀通配符一键下载yum installyum search

深入理解JVM虚拟机 - 自我编译JDK相关推荐

  1. java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  2. 深入理解Java虚拟机——程序编译与代码优化 (转)

    2019独角兽企业重金招聘Python工程师标准>>> 深入理解Java虚拟机--程序编译与代码优化 (转) 博客分类: java 一早期(编译期)优化 1概述 Java语言的&qu ...

  3. java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践

    本文转自: https://juejin.im/post/59e6c1f26fb9a0451c397a8c 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...

  4. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  5. 深入理解Java虚拟机-程序编译与代码优化

    本博客主要参考周志明老师的<深入理解Java虚拟机>第二版 读书是一种跟大神的交流.阅读<深入理解Java虚拟机>受益匪浅,对Java虚拟机有初步的认识.这里写博客主要出于以下 ...

  6. 接口多个实现类加载哪个_深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  7. 深入理解JVM虚拟机之垃圾回收

    深入理解JVM虚拟机之垃圾回收 什么叫做垃圾? 没有引用指向得对象都称为垃圾,好比如我们放风筝,哪些断了线得风筝都称之为垃圾. JVM怎么查找这些垃圾 一般又两种算法,1.可达性分析.2.引用计数 引 ...

  8. 深入理解JVM虚拟机_4 JVM内部结构分析-栈

    深入理解JVM虚拟机_4 JVM内部结构分析-栈 作者:田超凡 原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂 栈 1. Java 虚拟机栈也是线程私有的,它的⽣命周期和线程相同,描述的是 Jav ...

  9. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...

    虚拟机系列文章 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析 深入理解 Java 虚拟机-如何利用 Visual ...

最新文章

  1. 利用人类神经网络进行蛋白质设计
  2. linux基础命令_Linux命令基础大全
  3. 移动端H5页面注意事项
  4. 如何让springboot中的某些html文件不经过thymeleaf模板解析?
  5. BUG总结—Navicat连接Mysql8.0.11出现1251错误
  6. springcloud(十一):服务网关Zuul高级篇
  7. 对象关系映射(ORM)及代码生成器和插件C#源码(DBFrameworkV4.5.3)
  8. 1282B1. K for the Price of One (Easy Version)
  9. Redis配置和常用命令
  10. 四个修改Docker默认存储位置的方法
  11. Codeforces Round #382 (Div. 2) D. Taxes 歌德巴赫猜想
  12. 《你不知道的JavaScript》整理(二)——this
  13. c语言进度,C语言实现动态进度条
  14. 如何提高有效工作效率
  15. Retina、非Retina、点、像素、iPhone分辨率
  16. 弘辽科技:淘宝电商创业的生存法则,你知道吗?
  17. 图片扫描文字识别工具:text scanner mac中文版
  18. 开关电源环路学习笔记(3)-系统框图
  19. javac java编译-g
  20. 蓝牙AOA定位网关上报数据格式

热门文章

  1. CSS——CSS 背景应用
  2. 【学习笔记】费曼学习法
  3. java程序员学历重要吗?
  4. education 的发音
  5. socket编程——进一步理解accept函数
  6. Unity动态创建Avatar骨骼映射
  7. section怎么制造图框_Section2014(地质图件制作软件) 4.5.2官方版_增强辅助制图
  8. Altera_MAX_Plus_II_v10.2破解软件下载安装
  9. 晶体管和mos管区别,MOS管是什么?
  10. 技术控:巧将闲置旧手机电脑变成免费远程摄像头网络监控防盗系统