警告⚠️:本文耗时很长,先做好心理准备;编译openjdk源码需要很大的耐心,因为要踩很多坑,解决很多问题,本人从编译开始到结束用了两天时间,按照本篇教程踩坑会少许;谢谢观看

一、获取openjdk源码:

官网地址: http://jdk.java.net/

  

二、准备环境

安装 homwbrew:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

安装依赖:

brew install ccache  //加速编译
brew install freetype //字体引擎,编译过程中会被依赖到

 

三:环境编译(此处需要注意,mac系统版本与xcode版本及openjdk版本要相对应,否则会出现很多问题!!!)

Mac os: 10.14.4
 
xcode:9.2
  下载xcode的官方链接:Sign In - Apple ( 直接搜索9.2版本, 然后下载安装)
 
编译:
./configure --with-target-bits=64 --with-freetype=/usr/local/Cellar/freetype/2.10.1 --enable-ccache --with-jvm-variants=server,client --with-boot-jdk-jvmargs="-Xlint:deprecation -Xlint:unchecked" 
--disable-warnings-as-errors --with-debug-level=slowdebug 2>&1 | tee configure_mac_x64.log

 注意: 将--with-freetype指向你自己的freetype安装路径, 可能会出现权限不足情况: 请在./config加上 -bash  (或者自行查找解决方案)

输出如下内容,基本就说明你的环境没问题了:

A new configuration has been successfully created in
/Users/yourname/jdk9/build/macosx-x86_64-normal-serverANDclient-slowdebug
using configure arguments '--with-target-bits=64 --with-freetype=/usr/local/Cellar/freetype/2.9.1 --enable-ccache --with-jvm-variants=server,client --with-boot-jdk-jvmargs='-Xlint:deprecation -Xlint:unchecked' --disable-warnings-as-errors --with-debug-level=slowdebug'. Configuration summary:
* Debug level: slowdebug
* HS debug level: debug
* JDK variant: normal
* JVM variants: server client
* OpenJDK target: OS: macosx, CPU architecture: x86, address length:
* Version string: -internal+-adhoc.daiyongzhi.jdk9 (-internal) Tools summary:
* Boot JDK: java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101-b13) Java HotSpot(TM) -Bit Server VM (build 25.101-b13, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk1..0_101.jdk/Contents/Home)
* Toolchain: clang (clang/LLVM from Xcode 9.2)
* C Compiler: Version 9.0. (at /usr/bin/clang)
* C++ Compiler: Version 9.0. (at /usr/bin/clang++) Build performance summary:
* Cores to use:
* Memory limit: MB
* ccache status: Active (3.5) NOTE: You have requested to build more than one version of the JVM, which
will result in longer build times.

进行编译 openjdk1.9:

export LANG=C

make all LOG=debug  2>&1 | tee make_mac_x64.log

如果一切顺利,看到此结果就算编译成功了:

最后,验证一下:

cd openjdk/build/macosx-x86_64-normal-serverANDclient-slowdebug/jdk/bin
执行: ./java -version

警告⚠️:编译过程中遇到的问题(此处列举几次常见错误,如若出现其他错误请自行查找解决方案):

总结一下编译过程中遇到的问题:

vi src/share/vm/memory/virtualspace.cpp (char *):

vi src/share/vm/opto/loopPredicate.cpp (const TypeInt *):

vi src/share/vm/opto/loopPredicate.cpp (const TypeInt *):

修改报错信息( 错误解决方案):

#\. src/hotspot/share/memory/virtualspace.cpp # l585
if (base() != NULL) {
#\. src/hotspot/share/opto/lcm.cpp # l42
if (Universe::narrow_oop_base() != NULL) { // Implies UseCompressedOops. #\. src/hotspot/share/opto/loopPredicate.cpp # l915
assert(rng->Opcode() == Op_LoadRange || iff->is_RangeCheck() || _igvn.type(rng)->is_int()->_lo >= , "must be");

四、编译成功之后进行调试:

1.编写Java程序并使用自己编译的openjdk版本
 
修改idea编译器的jdk: 改为build/macosx-x86_64-normal-serverANDclient-slowdebug/images/jdk
 

java代码:

public class Main {
public static int size_1m = 1024*1024;
public static List<byte[]> list = new ArrayList<>();
public static void main(String[] args) throws Exception {
System.out.println("Hello World!");
for(int i=0;i<10;i++){
System.out.println(i+1);
list.add(new byte[size_1m]);
Thread.sleep(1000L);
}
}
}

  

配置idea虚拟机参数:

-XX:NewSize=6m
-XX:SurvivorRatio=4
-XX:MaxNewSize=6m
-Xlog:gc*:stdout:time,level,tags
-XX:+UseParallelGC

位置如下图所示:

然后运行:


2.通过运行Java程序调试openjdk: 

将openjdk目录下的hotspot倒入到CLion

配置参数并运行:

Executable是你编译生成的java命令,如我的目录是 build/macosx-x86_64-normal-serverANDclient-slowdebug/images/jdk/bin/java 
Program arguments就是你启动Java程序的参数,用IDEA运行上边编写的Java程序时,IDEA会打印运行指令如下:
/Users/yourname/jvm/openjdk/build/macosx-x86_64-normal-serverANDclient-slowdebug/images/jdk/bin/java -XX:NewSize=6m -XX:SurvivorRatio= -XX:MaxNewSize=6m -Xlog:gc*:stdout:time,level,tags -XX:+UseParallelGC -Dfile.encoding=UTF- -classpath /Users/yourname/IdeaProjects/mytest_projects/test_myjdk9/out/production/test_myjdk9 Main

与java联调:

Compile java:

Build Jvm:

参数:

COMPILER_WARNINGS_FATAL=false
LFLAGS="'-Xlinker -lstdc++'"
CC=clang
USE_CLANG=true
LP64=

随便修改源码方法,并在java源码调用(此处修改了openjdk源码的获取时间方法),展现效果如下:

如上所示:整个编译了及联调完毕,可以进行对源码为所欲为了;


附赠:centOs下编译openjdk:(该方法由好友提供,本人未真正测试,仅供参考):

、安装代码管理工具mercurial/获取自己获取代码包
、安装插件:
yum install alsa-lib-devel cups-devel libX* gcc gcc-c++ freetype-devel libstdc++-static ant make
、查看当前路径
[***@VM_0_3_centos openjdk-jdk8u-jdk8u]$ pwd
/home/liangding/openjdk-jdk8u-jdk8u
[***@VM_0_3_centos openjdk-jdk8u-jdk8u]$
、修改参数配置
[***@VM_0_3_centos openjdk-jdk8u-jdk8u]$ chmod +x configure
[***@VM_0_3_centos openjdk-jdk8u-jdk8u]$ ./configure —prefix=/home/liangding/jdk8u —enable-debug
、编译
[***@VM_0_3_centos openjdk-jdk8u-jdk8u]$ make
看到以下信息表示编译成功
## Finished jdk (build time ::)
—— Build times ———
Start -- ::
End -- ::
:: corba
:: hotspot
:: jaxp
:: jaxws
:: jdk
:: langtools
:: TOTAL
————————————
、测试编译后生成jdk的路径
[***@VM_0_3_centos build]$ pwd
/home/liangding/openjdk-jdk8u-jdk8u/build
[***@VM_0_3_centos build]$ ls -lrt
total
drwxrwxr-x liangding liangding Jul : linux-x86_64-normal-server-fastdebug
、写一个测试程序
[***@VM_0_3_centos ~]$ ls -lrt
total
-rw-rw-r———————————— liangding liangding Jul : jdk8u.zip
drwxrwxr-x liangding liangding Jul : jdk8u
drwxrwxr-x liangding liangding Jul : openjdk-jdk8u-jdk8u
-rw-rw-r———————————— liangding liangding Jul : HelloWorld.java
-rw-rw-r———————————— liangding liangding Jul : HelloWorld.class
[***@VM_0_3_centos ~]$ cat HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println(“HelloWorld openJDK”);
}
}
、测试
[***@VM_0_3_centos ~]$ ./openjdk-jdk8u-jdk8u/build/linux-x86_64-normal-server-fastdebug/jdk/bin/javac HelloWorld.java
、运行
[***@VM_0_3_centos ~]$ ./openjdk-jdk8u-jdk8u/build/linux-x86_64-normal-server-fastdebug/jdk/bin/java HelloWorld
HelloWorld openJDK
[***@VM_0_3_centos ~]$

原创不易,转载请标明出处,谢谢

Mac 10.14.4 编译openjdk1.9源码 及集成clion动态调试的更多相关文章

  1. 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码

    一.前言 最近在看<深入java虚拟机>,看完后,打算自己实际编译一个jvm出来看看,实践一下. 书上提到了Oracle JDK和OpenJdk的关系,Oracle Jdk7 和OpenJ ...

  2. 【原】storm源码之mac os x编译twitter storm源码

    twitter storm是由backtype公司创始人nathanmarz一手研发和开源的流计算(实时计算)框架,堪称实时计算领域的hadoop.nathanmarz也是在mac os x环境下开发 ...

  3. MAC 下编译 ANDROID P 源码 提示 internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13"]

    MAC 下编译 ANDROID P 源码出现下面的问题: ninja: no work to do. [21/21] out/soong/.bootstrap/bin/soong_build out/ ...

  4. Mac 10.14在新窗口中打开文件夹

    Mac 10.14 Open folders in new window (high Sierra) System Preferences > Dock. Change "Prefer ...

  5. msvc2013编译qt5.6源码

    1.回顾 说起到qt的编译,真是领人痛心啊,不仅编译选项繁多,而且编译时间比较久,总是能使想编译qt源码的人望而却步,呵呵...我就是其中一个,不知道从什么时候开始就想着把qt的源码编译一下,也尝试过 ...

  6. Ubuntu 下载 & 编译 Android5.1 源码

    ustc & tsinghua android srchttps://lug.ustc.edu.cn/wiki/mirrors/help/aosphttps://mirrors.tuna.ts ...

  7. 【转】编译Android系统源码和内核源码

    原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...

  8. vs2008编译FileZilla客户端源码

    vs2008编译FileZilla客户端源码 下载FileZilla客户端源码,下载地址https://download.filezilla-project.org/. FileZilla客户端解决方 ...

  9. 编译jmeter5.0源码

    jmeter5.0使用过程中,遇到request或者response乱码的情况,想要一次性解决这个问题,需要编译ApacheJMeter_http.jar这个包(lib\ext文件下)里的Reques ...

随机推荐

  1. 数据库之MySQL的基本使用

    数据库简介 数据库 数据库就是一种特殊的文件,其中存储着需要的数据:关系型数据库核心元素: 数据行(记录) 数据列(字段) 数据表(数据行的集合) 数据库(数据表的集合) Ubuntu进入数据库: 1 ...

  2. Python生成word

    Python生成word 使用python-docx-template库, 将html转为word. python-docx-template可以使用类似jinja2的模板语法. 依赖docx库, 安 ...

  3. django基础知识之上传图片:

    上传图片 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="& ...

  4. Linux命令学习-wget命令

    Linux系统中的wget是一个下载文件的工具,它用在命令行下,通过它可以方便的下载文件. 我们以百度的logo图片链接地址为例:https://www.baidu.com/img/bd_logo.p ...

  5. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  6. crontab 中curl命令无法正常执行

    这里所指curl无法执行Url情况是针对带参数的链接,方法体中无法获取参数的值. 比如: */7 * * * * curl http://localhost:8088/backening/sysOrd ...

  7. 简单学习之json格式说明

    json格式说明: 1.对象是一个无序的“‘名称/值’对”集合. (1)一个对象以“{”(左括号)开始,“}”(右括号)结束. (2)每个“名称”后跟一个“:”(冒号): (3)“‘名称/值’ 对”之 ...

  8. springcloud高可用方案

    1. 场景描述 公司在规划后续可能会做中台服务,考虑用微服务的方案,让用springcloud部署个简单的高可用Demo. 2. 解决方案 2.1 方案说明 demo用了5台虚拟机: (1)1台gat ...

  9. [译]Vulkan教程(33)多重采样

    [译]Vulkan教程(33)多重采样 Multisampling 多重采样 Introduction 入门 Our program can now load multiple levels of d ...

  10. C#开发中常用的加密算法总结

    相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天给大家分享我个人总结的一些加密算法: 常见的加密方式分为可逆和不可逆两种方式 可逆:RSA,AES,DES等 不可逆:常见的MD5 ...