我为什么要自己编译openjdk8以及那些坑

这是笔者第二次编译openjdk, 第一次编译的是openjdk7,那么好多人会好奇,为什么要自己编译openjdk呢,官方不是已经发布了安装包了么?

要回答这个问题就要明白c\c++是什么?Java又是什么?

记得有位业内同行说过,C++和Java之间隔着一堵由内存管理围成的墙,里面的人想出去,外面的人想进来。笔者从业多年确实见过不少内存管理高手,但是还是有一部分朋友是不喜欢内存管理的,但是如果想成为C++大牛,这关恐怕绕不过去。笔者第一次编译openjdk时候的想法很简单,就是打破这堵墙,如果连openjdk也是我自己编译的,那么就都是我C++的天下,可以任意调试,无所不能。由于时间的原因,第一次利用openjdk编译,我只研究了Java垃圾回收机制也就是GC相关的内容,后来工作太忙就没来得及自己研究其余的部分。今天终于有些时间,于是泡了一杯黄山毛峰,开始了下面的故事。下面我们来说说openjdk8的编译,和openjdk7的编译过程还是稍有区别的。

1. openjdk8代码构成

C\C++\Java, 不要问我为什么openjdk代码里面为什么还有Java, 这是一个鸡生蛋还是蛋生鸡的死循环..

2. 选择什么环境编译openjdk8

可供选择的环境按照OS分为三种,第一种是Windows, 由于openjdk8编译需要linux工具链,所以需要同时配置MingW比较复杂,第二种是Mac OSX, 由于openjdk8的编译需要借助xcode,而更麻烦的是需要老版本的xcode,不推荐,第三种就是Linux 但是需要选对版本,否则还是出问题,比如ubuntu2014和openjdk8就更配,如果用ubuntu2016就需要用hg下载最新的开发版代码,一共将近1g的单个文件,还不压缩,如果网速不行,恐怕得下载几天。笔者最终选择的是ubuntu2014和openjdk8无更新版本。

3. 编译过程详解

<1>下载openjdk-8-src-b132-03_mar_2014.zip,官网下载就成,如果网速不行,就找找工具可以事半功倍。

<2>笔者用了虚拟机VirtualBox,然后在VirtualBox里面装了一个ubuntu2014,最开始用的ubuntu2016由于和openjdk8气场不和,又装了一个ubuntu2014,如果真想用ubuntu2016,代码需要用hg拉最新的开发分支,网速不行的慎重。

<3>sudo mount -t vboxsf SHare /media/sf_SHare将共享文件夹在ubuntu2014里面挂载一下,否则共享文件夹在ubuntu2014里面看不到。

<4>sudo bash configure 安装所有提示的安装包用apt-get install。

<5>sudo bash configure --with-debug-level=slowdebug。

<6>sudo make all CONF=linux-x86_64-normal-server-slowdebug

4. 编译结果

----- Build times -------
Start 2016-10-02 15:07:35
End 2016-10-02 16:15:20
00:02:54 corba
00:02:18 demos
00:11:41 docs
00:21:11 hotspot
00:04:42 images
00:01:32 jaxp
00:02:00 jaxws
00:17:21 jdk
00:02:42 langtools
00:01:13 nashorn
01:07:45 TOTAL
-------------------------

5. 运行结果

solidos@solidos-pc:~/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin$ ./java -version
openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-root_2016_10_02_15_06-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)

6.GDB调试结果

solidos@solidos-pc:~/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin$ gdb java
GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from java...done.
(gdb) b main
Breakpoint 1 at 0x4006dd: file /home/solidos/openjdk/jdk/src/share/bin/main.c, line 97.
(gdb) r -classpath PossibleReordering
Starting program: /home/solidos/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -classpath PossibleReordering
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Breakpoint 1, main (argc=3, argv=0x7fffffffdde8) at /home/solidos/openjdk/jdk/src/share/bin/main.c:97
97 const jboolean const_javaw = JNI_FALSE;
(gdb) list
92 int
93 main(int argc, char **argv)
94 {
95 int margc;
96 char** margv;
97 const jboolean const_javaw = JNI_FALSE;
98 #endif /* JAVAW */
99 #ifdef _WIN32
100 {
101 int i = 0;
(gdb)

7. 结论

本文详细的列出了openjdk8编译的推荐环境和步骤,希望对有需要的人有所帮助,可以少走弯路..

我为什么要自己编译openjdk8以及那些坑的更多相关文章

  1. JAVA虚拟机学习笔记(一)Windows10下编译OpenJDK8

    转载请注明源地址:http://www.cnblogs.com/lighten/p/5906359.html 1. 编译环境的准备 1.1 JDK源码下载 OpenJDK是JAVA发展史中的一个开源项 ...

  2. 64位windows8.1编译openjdk8

    首先下载openjdk8http://hg.openjdk.java.net/jdk8/jdk8/这里用到版本管理工具Mercurial,与git有些类似,不了解的话可以查一下.clone后,里面有个 ...

  3. JVM-Ubuntu18.04.1下编译OpenJDK8

    近期开始学习JVM,看的是周老师的<深入理解Java虚拟机>,打算先自己编译个JDK来提升对JVM的兴趣.本文分三部分来描述编译OpenJDK的过程,分别是编译前准备工作.构建编译环境.进 ...

  4. Centos7 下编译 Openjdk8

    本文主要介绍如何在 Centos7 下编译 Openjdk8 源码,<深入理解java虚拟机>第二版网上好多 openjdk7 的帖子,编译 jdk8 和 7 还是有些差别的,比如大家经常 ...

  5. 在docker上编译openjdk8

    以前曾经试过在VMware上安装linux,再在linux上编译openjdk8,但是每次都不顺利,例如linux环境,预装依赖软件,openjdk源码的选择等环境都会遇到问题,一旦失败再重新开始挺费 ...

  6. Win10下编译OpenJDK8

    导航目录 Win10下编译OpenJDK8 相关参考文章 编译环境 编译前准备 1.安装 Visual Studio 2010 Professional 2. 准备OpenJDK8 3. 编译JDK环 ...

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

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

  8. JDK---00Linux上编译openjdk8

    Centos 7 编译自定义jdk8 1. 安装所需的依赖 yum install alsa-lib-devel cups-devel libX* gcc gcc-c++ freetype-devel ...

  9. c/c++ 多线程 ubuntu18.04 boost编译与运行的坑

    多线程 boost编译与运行的坑 背景:因为要使用boost里的多线程库,所以遇到了下面的坑. 系统版本:ubuntu18.04 一,安装boost 1,去boost官网下载 boost_1_XX_0 ...

随机推荐

  1. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  2. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  3. Web大前端时代之:HTML5+CSS3入门系列

    准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...

  4. 由Dapper QueryMultiple 返回数据的问题得出==》Dapper QueryMultiple并不会帮我们识别多个返回值的顺序

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#dapper 今天帮群友整理Dapper基础教程的时候手脚快了点,然后遇到了一个小问题,Dapp ...

  5. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  6. HTML5 sessionStorage会话存储

    sessionStorage 是HTML5新增的一个会话存储对象,用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据.本篇主要介绍 sessionStorage(会话存储) ...

  7. npm package.json属性详解

    概述 本文档是自己看官方文档的理解+翻译,内容是package.json配置里边的属性含义.package.json必须是一个严格的json文件,而不仅仅是js里边的一个对象.其中很多属性可以通过np ...

  8. C++内联函数

    在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数.内联函数作为编译器优化手段的一种技术,在降低 ...

  9. Dynamics CRM 之ADFS 使用 WID 的独立联合服务器

    ADFS 的使用 WID 的独立联合服务器适用于自己的测试环境,常用的就是在虚机中使用. 拓扑图如下: wID:联合身份验证服务配置为使用 Windows 内部数据库

  10. Android之使用Bundle进行IPC

    一.Bundle进行IPC介绍 四大组件中的三大组件(Activity.Service.Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口 ...