如何在Ubuntu 16.04上编译OpenJdk 8并使用Netbeans调试Java原子类在JVM中的实现?
摘要:一、前言 前一阵子比较好奇,想看到底层(虚拟机、汇编)怎么实现的java 并发那块。 volatile是在汇编里加了lock前缀,因为volatile可以通过查看JIT编译器的汇编代码来看。 但是原子类,本来在jvm中就是汇编实现的,反而没
一、前言
前一阵子比较好奇,想看到底层(虚拟机、汇编)怎么实现的java 并发那块。
volatile是在汇编里加了lock前缀,因为volatile可以通过查看JIT编译器的汇编代码来看。
但是原子类,本来在jvm中就是汇编实现的,反而没法看。如果能实际跟踪一下断点,应该也算实际验证了。
这边基本参照下面文章来的,补充了很多让初学者头疼的细节,并拓展了一部分,
包括调试java 原子类在jvm中的实现的一些细节。
https://marcin-chwedczuk.github.io/debugging-openjdk8-with-netbeans-on-ubuntu
源码编译OpenJDK8,主要有以下几个步骤:
下载Ubuntu
下载OpenJdk源码
下载Boot JDK,一般要比当前要编译的版本低
安装必要的依赖
configure && make
上面几步搞完,基本虚拟机就可用了。但离调试,还有一点点距离。
用NetBeans调试JVM代码,有以下几个步骤:
下载NetBeans
配置OpenJdk工程
配置Java工程
Debug OpenJdk(即虚拟机源码)
二、源码编译OpenJDK8
1、下载Ubuntu
我用的16.04,链接地址:https://www.ubuntu.com/download/alternative-downloads
我是用vmvare装的,配置建议给高一点。
2、下载OpenJdk源码
据原文说法,OpenJDK使用Mercurial进行版本管理。另外一个名叫AdoptOpenJDK project.提供了OpenJDK的镜像,可以让我们用git下载。
站点的官网如下:https://adoptopenjdk.net/about.html
主页上说他们的目标就是:
Provide a reliable source of OpenJDK binaries for all platforms, for the long term future.
据我的使用体验来说,之前编译过一次OpenJDK,各种报错,各种改源码才能编译通过。这次确实编译很顺,代码一句没改。
看起来,代码还是比较可靠的。
不扯别的了,直接clone搞下来吧,我这边是直接在/home/ckl目录下执行的shell:
git clone --depth 1 -b master https://github.com/AdoptOpenJDK/openjdk-jdk8u.git
3、下载Boot JDK
编译过jdk的同学应该知道,我们得先有只母鸡才能编译openJDK源码。
这边我用的oracle的jdk 1.7,这边贴个csdn的下载链接,我那天弄的时候官网速度太慢。
https://download.csdn.net/download/qq_33499492/10288883
怎么安装就不说了,我解压后放在/usr/local
记得修改环境变量(/ect/profile):
export JAVA_HOME=/usr/local/jdk1.7.0_80
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
然后,source /ect/profile 使之生效。
4、安装依赖
sudo apt install \
libx11-dev \
libxext-dev \
libxrender-dev \
libxtst-dev \
libxt-dev \
libcups2-dev \
libfreetype6-dev \
libasound2-dev
这个依赖不够,我这边装的时候,还报了一些依赖缺失,直接安装报错提示里的执行命令下载就完了。
我这里遇到比较坑的一点是(当然我对ubuntu完全不熟),一开始用的是官方的repository 源,后来换成阿里云的,各种报错。
吓得我赶紧改回来了,就没问题了。
这里遇到问题可以咨询我。
