编译环境

  1. Windows10,VMware15,Ubuntu18.04, 虚拟环境。
  2. PC机,内存32G,CPU 16 核心,I7八代。
  3. Ubuntu18.04 虚拟机。

环境准备

  1. 安装Boot JDK,下载Linux版Oracle JDK8,解压安装到/usr/lib下, 执行
gedit ~/.bashrc

文件末尾追加如下

export JAVA_HOME=/usr/lib/jdk/jdk1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH

使配置生效

source ~/.bashrc
  1. 下载 OpenJDK9
    由于官方下载缓慢,直接从gitee上下载OpenJDK9分支,拷贝下载的openjdk到新建的jdk目录下解压,进入解压后的openjdk目录

编译JVM

1.执行如下命令根据提示下载缺失的库

bash ./configure
bash configure --with-debug-level=slowdebug
bash configure --disable-warnings-as-errors --with-debug-level=slowdebug --with-native-debug-symbols=internal

2.开始编译

make

出现错误

Error: No CONF given, but more than one configuration found.
Available configurations in /home/wly/dev/jdk/build:
* linux-x86_64-normal-server-slowdebug
* linux-x86_64-normal-server-release
Please retry building with CONF=<config pattern> (or SPEC=<spec file>).

选择一个配置后再次编译

make CONF=linux-x86_64-normal-server-slowdebug

编译成功,十几分钟就好了

Stopping sjavac server
Finished building target 'default (exploded-image)' in configuration 'linux-x86_64-normal-server-slowdebug'

验证JVM

1.创建javac和java命令链接

ln -s /home/charlie/jdk/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac javac9
ln -s /home/charlie/jdk/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java java9
  1. 创建Hello.java程序
public class Hello{public static void main(String[] args){System.out.println("hello world !");}
}

3.执行 javac 命令生成字节码

javac Hello.java

4.执行 java 命令 执行程序

java Hello

结果如下:

调试HotSpot

  1. 现在Linux版本Clion IDEA
  2. 打开IDEA, 选择 New CMake Project from Sources,选择已编译好的hotspot目录,打开


3. 配置调试环境(1. Edit Configuration 2.选择java 3.BeforeLaunch 去掉Build )


4. 断点调试

打开allocation.cpp 设置如图断点,点击绿色的bug虫。

总结

JVM是Java的核心,JVM屏蔽了底层硬件细节,为Java跨平台提供了可能。JVM是一个庞大的项目,里面包含了复杂的实现细节,JVM构建了代码执行引擎,以屏蔽各硬件平台差异。JVM包含了许多优秀的设计思想和实现,包括垃圾回收,JIT, AOT, OopKlass对象模型,执行引擎,字节码机制,类加载机制栈式指令集,字节码解释器,模版解释器等等,得益于其优秀的设计和不断地与时俱进,Java平台一直受到开发者的青睐。今天是JVM系列的开篇,JVM的优秀让人兴奋。

HotSpot 源代码编译相关推荐

  1. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  2. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化

    Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...

  3. 浅析Hotspot JIT编译

    1. 什么是编译? 像java,C语言这些高级程序语言,计算机并不能直接执行.计算机认识的是汇编或者机器语言,是可以直接由计算机直接执行的.所以从高级语言转化为计算机认识的低级语言的过程叫做编译.   ...

  4. 【CLR的执行模型:将源代码编译成托管模块】

    CLR:由多种不同编程语言使用的运行库 托管模块:中间语言和元数据 非托管语言:C/C++,不过此为特殊,可以写成托管代码 托管语言:C# 托管模块 1,PE32/PE32+头:PE32运行在win3 ...

  5. 从源代码编译里程碑的 ICS ROM

    从源代码编译里程碑的 ICS ROM 操作系统选择 Ubuntu 10.04, 可以用虚拟机: 安装 Android SDK , 并更新: 打开命令行窗口, 输入下面的命令, 准备编译环境:  sud ...

  6. Linux源代码编译安装详解

    使用源代码编译安装软件有以下优点,获取软件的最新版及时修复bug,软件功能可按需选择或定制,有更多软件可供选择,源码包适用于各种平台. 工具/原料 一台装有Linux操作系统的电脑 接入互联网络并能正 ...

  7. linux ubuntu pkg-config工具的使用(源代码编译库接口查询工具)

    后更... 文章目录 1. pkg-config介绍 2. pkg-config的使用 1. pkg-config介绍 pkg-config是一个在源代码编译时查询已安装的库的使用接口的计算机工具软件 ...

  8. python3源代码_Python3源代码编译安装

    Python3源代码编译安装 安装必要工具 yum-utils ,它的功能是管理repository及扩展包的工具 (主要是针对repository) $ sudo yum install yum-u ...

  9. 【AWSL】之Linux源代码编译及配置yum源(tar 解包、./configure配置软件模块、make)

    源代码编译 序言 一.源代码概述 1.使用源代码安装软件的优点 2.应用场合举例 3.安装源代码软件为什么使用编译安装 二.编译安装的基本思路 三.配置本地yum源仓库 四.`yum常用命令` 五.` ...

最新文章

  1. bitmap画文字 居中_【每日问答29】一键居中CAD表格中的文字
  2. QTP - 描述性编程
  3. roscore尚未安装 问题解决方案
  4. angular6父子组件之间的引入报错
  5. html地区三级联下拉列表,JS-三级联下拉列表
  6. opencv论坛_Opencv批量添加logo的解决方案
  7. linux下qq怎么截图,ubuntu 12.04使用QQ截图安装教程
  8. 转载一篇阅读文章(还算不错吧)
  9. 【零基础学Java】—Java运行机制(三)
  10. 计算机毕业设计Java校园一卡通管理系统(源码+系统+mysql数据库+Lw文档)
  11. AI虚拟偶像正崛起,是否可以取代你的idol?
  12. 电赛校赛经验-程控风力摆
  13. Python math库函数
  14. Mac开发-公证流程记录Notarization-附带脚本
  15. 怎么理解卡卷会员接口
  16. 献给杭电五十周年校庆的礼物+递推
  17. rap2使用姿势——前端、后端、测试必看(多gif图)
  18. android imageview图片失真,imageView 图片变形失真
  19. MongoDB面试题问题以及参考答案
  20. ubuntu中总是提示无法获得锁 (资源暂时不可用) 进程被占用 解决办法

热门文章

  1. OAuth与SpringSecurity介绍——为什么CSDN可以获取到微信的头像?
  2. nginx配置tomcat反向代理出现 java.lang.IllegalArgumentException: The character [_] is never valid in a domai
  3. linux mount 指定用户名,linux中mount/umount命令的基本用法及开机自动挂载方法
  4. 小米扫地机器人清扫完成暂停_小米扫地机器人2代使用情况总结
  5. postgresql 常用基本命令
  6. pip常用镜像源(清华源,阿里源,豆瓣源,百度源)
  7. 谷歌开源Live Transcribe语音识别转文字工具
  8. Fira Code,可以让不等号!=直接显示出来的字体
  9. WPF图片切换问题(美女时钟)
  10. 你的交易系统有什么特别之处吗?