《深入理解java虚拟机》读书笔记(一)
之前看这本书在第一步编译上没成功就没看了这回把这本书捡起来,该文章作为《深入理解java虚拟机》整本书的记录
# 一、手动编译jdk
# 1. 获取OpenJDK源码
从官网下载:http://jdk.java.net/java-se-ri/8
# 2. 系统需求
本次使用wsl的ubuntu16.04LTS
# 3. 构建编译环境
因为OpenJDK的各个组成部分有的是使用C++编译,有的是使用Java自身实现的,所以编译这些Java代码需要一个可用的JDK,官方称这个JDK为“Bootstrap JDK”,通常是使用上一个版本的JDK,所以我使用的版本为:jdk-7u80-linux-x64
下载依赖包
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache
# 4. 开始编译
解压OpenJDK源码并进入目录
unzip openjdk-8u40-src-b25-10_feb_2015.zip
cd openjdk/
2
运行命令
sudo bash ./configure --with-target-bits=64 --with-boot-jdk=/home/jiazhifeng/workspace/jdk1.7.0_80/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0
2
==说明下第一条命令configure用到的参数作用:
–with-target-bits=64 :指定生成64位jdk;
–with-boot-jdk=/usr/java/jdk1.7.0_80/:启动“Bootstrap JDK”的路径;
–with-debug-level=slowdebug:编译时debug的级别,有release, fastdebug, slowdebug 三种级别;
–enable-debug-symbols ZIP_DEBUGINFO_FILES=0:生成调试的符号信息,并且不压缩;==
这里出现了点问题
++configure: error: Could not find freetype! You might be able to fix this by running 'sudo apt-get install libfreetype6-dev'. configure exiting with result code 1++ 但是我安装以后还是出现这个问题,在stack overflow查看了一下需要额外增加一句配置
./configure --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu
之后配置如下
sudo bash ./configure --with-target-bits=64 --with-boot-jdk=/home/xg/jdk1.7.0_80/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu
出现如下代码算是可以进行下一步
Configuration summary:
* Debug level: slowdebug
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
Tools summary:
* Boot JDK: java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) (at /home/xg/jdk1.7.0_80)
* C Compiler: gcc-5 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 version 20160609 (at /usr/bin/gcc-5)
* C++ Compiler: g++-5 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 version 20160609 (at /usr/bin/g++-5)
Build performance summary:
* Cores to use: 10
* Memory limit: 16335 MB
* ccache status: installed, but disabled (version older than 3.1.4)
Build performance tip: ccache gives a tremendous speedup for C++ recompilations.
You have ccache installed, but it is a version prior to 3.1.4. Try upgrading.
You might be able to fix this by running 'sudo apt-get install ccache'.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
执行编译前先设定下语言选项,可先执行echo $LANG,看下输出,如果不是C,则执行export LANG=C 之后输入命令
sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0
# 5. 验证
cd build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/
./java -version
2
成功编译
openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-root_2019_12_13_19_39-b00)
OpenJDK 64-Bit Server VM (build 25.40-b25-debug, mixed mode)
2
3
# 6.出现的问题补充
# ①
/mnt/Data/AppsData/Repository/java/jdk/8/hotspot/src/os/linux/vm/os_linux.inline.hpp:127:18: warning: ‘int readdir_r(DIR*, dirent*, dirent**)’ is deprecated (declared at /usr/include/dirent.h:183) [-Wdeprecated-declarations] if((status = ::readdir_r(dirp, dbuf, &p)) != 0) {
原文链接:https://blog.csdn.net/desiyonan/article/details/80802066
分析原因:
- gcc 编译环境中开启了相关警告提示
解决方案: 查看./hotspot/make/[you_os]/makefiles/gcc.make文件
在./hotspot/make/linux/makefiles/gcc.make文件中找到
WARNINGS_ARE_ERRORS = -Werror
将其 注释 或改为 WARNINGS_ARE_ERRORS = -Wno-all
类似的警告都可以通过以下参数来设置,在该文件下找到WARNING_FLAGS,就在上述变量附近,添加需要注释的警告
WARNING_FLAGS = -Wno-deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -Wno-error
或者关闭所有警告
WARNING_FLAGS = -w
不过貌似只对编译hotspot时有用
# ②
left operand of shift expression ‘(-1 << 28)’ is negative [-fpermissive] invalid suffix on literal; C++11 requires a space between literal and string
报这个错误是由于ubuntu18.x或是ubuntu19.x的gcc和g++版本太高了,导致编译通不过,所以需要将ubuntu中的gcc和g++版本降低。
解决方法如下:
先查看自己ubuntu中的gcc版本 gcc --version 我是把gcc和g++降到gcc/g++5的版本,就可以编译通过了
下载gcc/g++ 5: sudo apt-get install -y gcc-5 sudo apt-get install -y g++-52. 链接gcc/g++实现降级: cd /usr/bin sudo rm gcc sudo ln -s gcc-5 gcc sudo rm g++ sudo ln -s g++-5 g++ 再次查看gcc版本,可以看到已经降级.
gcc --version
链接:https://www.jianshu.com/p/8a53708dd08a
# ③
如果遇到: "this OS is not supported:" 'uname -a';exit 1; 这个错误就是内核版本不支持的问题(openjdk8我还没遇到这个错误),在编译Hotspot时通不过
解决:找到hotspot/make/linux/Makefile,在Makefile文件中定位到SUPPORTED_OS_VERSION的代码,在末尾添加自己ubuntu当前的内核版本。
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%
ubuntu18.04的内核版本是4.x%的,大家查看下自己的内核版本是多少,如果Makefile文件中有,就不用添加了,没有添加上就行 本人的是 5.0的所以就在末尾添加5% 链接:https://www.jianshu.com/p/8a53708dd08a