零蚀
前言
- 既然决定了五一要好好学学虚拟机,那就行动起来,在经历了11个小时的顺风车,终于在今天凌晨3点回到了家,好好休息一下。(记录一个生活node)。
- 这个笔记借鉴的是《深入理解java虚拟机》(第三版),有兴趣,自己可以看看,当时是看到这本书,就决定学了,原本计算5天一天一章,但是回家耽搁了,尽量快速结束吧。先把书上过完(喜欢看书的小伙伴可以网盘上找找,实在寻不到,去某鱼也就1~2块钱的事,一定要买最新的)。
- 用java也有几个年头了,但是我和它不熟,罪孽啊,作为一个java开发,我连他都不认识,就知道两个api,好吧,我裂了,所以5-1前直接决定虚拟机
下载jvm源码
-
方法一(不推荐)
通过Mercurial版本控制工具来获取源码。
hg clone http://hg.openjdk.java.net/jdk8u/jdku8 cd jdku8 chmod 755 get_source.sh ./get_source.sh
可以自己到对应的网址里,看看自己需要的jdk内容,然后根据目录进行下载。这里会由于文件数量过多,而导致文件下载的速度会非常的慢。
[? 此方式下载源码的操作参考链接]
[? openjdk官网下载压缩包]
点击右侧的browse然后点击zip下载jdk的压缩包,但是真的很卡,而且很慢,如果断了就得重新开始了,而且这个很容易发生,所以不建议尝试。下了一天直接裂开。
-
方法二(不推荐):
这个网站也是能下载到源码的,可能是以前的吧,只能支持获取到jdk8及以前的源码,下载链接如下**[?jdk 8的下载链接]**。要知道我们的编译的jdk和我们所用的jdk一定要保持同一个版本,因为编译的时候会用到我们当前jdk,所以版本不匹配会产生很多问题,编译第一步都走不通。
-
方法三:
当然我也是走这个方法的,那就是在github下载源码,早该想到!!![? github-openjdk所有的版本链接],我这里用的是11-28。网上推荐使用这个。
源码编译
-
配置信息
下载好内容后,就开始编译了,下载这里我还是比较推崇用迅雷,不需要会员,速度快很多,10几分钟的事。然后下载下来之后,首先打开看一下,和ffmpeg一样都有
configure
的执行文件,那心里就明白了,那肯定第一步要执行一下,check一下文件的内容,有什么缺损,补完一下文件内容,切换到openjdk的目录下,然后./configure
运行一下。果然还是报错了,跟着报错内容来下载自己缺少的工具即可。
# 报错 # You might be able to fix this by running 'brew install autoconf'. # Error: Cannot find autoconfbrew install autoconf
除此之外这里还爆出一个关于xcode的问题,可能和系统升级有关。
# xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance # 解决方案: sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
安装好了之后继续使用
./configure
然后可以看到以下内容,基本基本就是ok了。# 当然这个configure执行前也是要赋予可执行文件的权限 chmod u+x configure
开始编译,这里的images 是product-images
为编译目标的,这个目标是编译出整个jdk的镜像。
# 清除上一次的编译内容(习惯)
make clean
# 编译整个Openjdk的内容,或者直接make也行
make images
-
源码调试
用clion,通过import CMake Project 打开文件包,可以看到这里自动生成了一个cmakelists但是这个文件暂时是没有用的,
这里的JavaMain就是Hot-Spot虚拟机的启动入口。我们将目录指向
build/macosx-x86_64-normal-server-release/jdk/bin/java
然后program arguments
设置为-XX:+TraceBytecodes -XX:StopInterpreterAt=<n>
,然后点击减号去掉build。然后就可以点击运行了。-XX:+TraceBytecodes -XX:StopInterpreterAt=<n>
这个作为参数只有在debug模式下才有用。其主要作用是方便开发人员调试解释器,因为目前的字节码都是用的模板解释器,在运行时生成汇编代码,所以我们无法设置断点。借用一下别人的jvm生命周期的时序图。
如果需要编译生成新的JDK,避免文件缺失,需要修补CMakeLists.txt,网上有关于这个的文件补全资源,可以对照这里的
src/java-11-openjdk/CMakeLists.txt
来看**[? 修补文件]**
? 前言
? Android 知识栈
? JVM 快速排序篇
? NO.2 内存区域&回收算法
? NO.3 垃圾收集器&ClassLoader
? NO.4 原子&线程