文档章节

源码编译OpenJDK8

SEOwhywhy
 SEOwhywhy
发布于 06/04 11:36
字数 1698
阅读 31
收藏 0

  一、前言
  
  二、源码编译OpenJDK8
  
  1、下载Ubuntu
  
  2、下载OpenJdk源码
  
  3、下载Boot JDK
  
  4、安装依赖
  
  5、配置脚本
  
  6、编译成功的效果
  
  三、Netbeans调试JVM
  
  1、下载NetBeans 8.2
  
  2、下载oracle jdk 1.8
  
  3、安装net beans
  
  4、配置Open JDK工程
  
  5、运行HelloWorld
  
  6、调试Hello World
  
  7、在netbeans中新建java工程,并调试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.cmylept.cn /download/alternative-downloads
  
  我是用vmvare装的,配置建议给高一点。
  
  2、下载OpenJdk源码
  
  据原文说法,OpenJDK 使用Mercurial进行版本管理。另外一个名叫AdoptOpenJDK project.提供了OpenJDK的镜像,可以让我们用git下载。
  
  站点的官网如下:https://www.cmylli.com 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 源,后来换成阿里云的,各种报错。
  
  吓得我赶紧改回来了,就没问题了。
  
  这里遇到问题可以咨询我。
  
  5、配置脚本
  
  在/home/ckl/openjdk-jdk8u下,新建脚本build.sh:
  
  build.sh:
  
  bash ./configure --with-target-bits=64 --with-boot-jdk=/usr/local/jdk1.7.0_80/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
  
  make all ZIP_DEBUGINFO_FILES=0
  
  给build.sh增加可执行权限并执行:
  
  chmod +x build.sh
  
  ./build.sh
  
  6、编译成功的效果
  
  切换到对应目录下:
  
  /home/ckl/openjdk-jdk8u/build/linux-x86_64-normal-server-slowdebug/jdk/bin
  
  ./java -version
  
  在该目录下,新建个HelloWorld来运行一下:
  
  public class HelloWorld {
  
  public static void main(String[www.ztyLegw.cn] args) {
  
  System.out.println("hello world");
  
  }
  
  }
  
  回到顶部
  
  三、Netbeans调试JVM
  
  1、下载NetBeans 8.2
  
  下载安装主要参考:
  
  https://netbeans.org/community/releases/82/install.html
  
  NetBeans主页上,最新版本出到11.0了,但是在网上看到都是用的NetBeans 8开头版本的,有时间再折腾吧。
  
  我这里下载的是8.2,链接:
  
  https://netbeans.org/downloads/8.2/
  
  因为OpenJDK是c++写的,所以我们必须选择带C/C++支持的,我这里直接选All。
  
  另外,注意选linux平台,最好选英语,免得出幺蛾子。
  
  2、下载oracle jdk 1.8
  
  为啥又要下载jdk? 这个jdk不是编译openJdk源码用的那个,这个是运行NetBeans 8.2需要。
  
  The Java SE Development Kit (JDK) 8 is required to install NetBeans IDE.
  
  下完安装后,把环境变量里设的jdk路径改掉吧:
  
  export JAVA_HOME=/usr/local/jdk1.8.0_211
  
  export JRE_HOME=${JAVA_HOME}/jre
  
  export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
  
  export PATH=${JAVA_HOME}/bin:$PATH
  
  source /etc/profile
  
  3、安装net beans
  
  安装:
  
  ./netbeans
  
  安装过程,记得不要全部默认,可以自己定制化:
  
  4、配置Open JDK工程
  
  安装完成后,在桌面上,会生成一个图标,直接双击启动。
  
  后面的步骤,可以参考:
  
  https://marcin-chwedczuk.github.io/debugging-openjdk8-with-netbeans-on-ubuntu
  
  然后接下来几步都可以直接next,最后点finish会开始configure。
  
  5、运行HelloWorld
  
  配置我们的openjdk工程去运行之前写的HelloWorld程序。
  
  对着openjdk-jdk8u工程,右键选择properties:
  
  选择编译出的jdk来运行我们的class:
  
  应该能看到输出Hello World了。
  
  6、调试Hello World
  
  System.out.println(...)会调用jdk/src/share/native/java/io/io_util.c的writeBytes
  
  直接在该函数打个断点,然后debug
  
  不出意外,应该会停到该断点。
  
  7、在netbeans中新建java工程,并调试jvm
  
  我们来调一个有用点的程序,看看原子类在jvm中的实现到底是不是像网上的博客那样运行的。
  
  先像上面这样,建个java工程,写点代码,然后运行。
  
  复制代码
  
  import java.util.concurrent.atomic.AtomicBoolean;
  
  import java.util.concurrent.atomic.AtomicInteger;
  
  /**
  
  *
  
  * @author ckl
  
  */
  
  public class TestSample {
  
  private static AtomicInteger stop = new AtomicInteger(12);
  
  /**
  
  * @param args the command line arguments
  
  */
  
  public static void main(String[www.yuntianyul.com] args) {
  
  Boolean result = stop.compareAndSet(1314, 1413);
  
  // TODO code application logic here
  
  if (result){
  
  System.out.println(" true result ");
  
  }else {
  
  System.out.println("false result");
  
  }
  
  }
  
  }
  
  复制代码
  
  调试jvm:
  
  对着openjdk-jdk8u工程点右键,properties。
  
  建立断点,cas调用一般会调用unsafe.cpp的以下代码:
  
  断点ok了,然后点选中openjdk-jdk8u工程后,点击debug按钮:
  
  果然,程序马上就停在这了。但是,cas操作可能在很多地方都调用了,所以我们要仔细观察Variables窗口,看看是不是我们发起的那个调用:
  
  跳过了十多次以后。。。
  
  。。。
  
  稍微跟一下:
  
  直接进到这段汇编了,用了cmpxchg指令来实现cas,还加了lock前缀(mp为1)。lock前缀下次讲。主要是锁总线,或者锁缓存,达到原子操作的目的。

© 著作权归作者所有

SEOwhywhy
粉丝 8
博文 155
码字总数 342404
作品 0
私信 提问
ubuntu编译并调试OpenJDK8源码实践

最近打算研究一下 jvm 相关的知识,所以想编译 OpenJDK 的源码,一直在Mac上面编译,但是总是出现莫名其妙的error,还找不到有效的解决方式,所以还是进入 Ubuntu 下面进行编译,虽然中间也出...

ostracod
2017/11/28
0
0
ubuntu编译并调试OpenJDK8源码实践

最近打算研究一下 jvm 相关的知识,所以想编译 OpenJDK 的源码,一直在Mac上面编译,但是总是出现莫名其妙的error,还找不到有效的解决方式,所以还是进入 Ubuntu 下面进行编译,虽然中间也出...

ostracod
2018/06/29
0
0
在Ubuntu14下构建Hotspot并使用Eclipse调试

偶尔会看一点点JVM代码,所以尝试构建了一把最新的OpenJDK8 1.环境介绍 1)时间: 2015-05-13 2)系统: Linux haogrgr-vm 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2...

德胜
2015/05/14
818
2
openJDK之如何下载各个版本的openJDK源码

如果我们需要阅读openJDK的源码,那么需要下载,那么该去哪下载呢? 现在JDK已经发展到版本10了,11已经处于计划中,如果需要特定版本的openJDK,它们的下载链接在哪呢? 1.openJDK的项目 链接...

汉斯-冯-拉特
2018/08/20
13.3K
6
Android源码阅读-编译8.0源码

前面的话 搞Android的人不编译一下Android的源码感觉人生好像不大完整似的。早就想编译Android源码,但是前前后后经历好长时间都没有把它搞出来,就这样拖着,直到昨天晚上才真正的把Android...

ostracod
2017/11/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
32分钟前
3
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
36分钟前
4
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
53分钟前
8
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
今天
8
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
915
12

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部