当前位置: 代码迷 >> 综合 >> NO.1 OpenJDK 前言
  详细解决方案

NO.1 OpenJDK 前言

热度:89   发布时间:2023-12-15 16:21:53.0

零蚀


前言

  • 既然决定了五一要好好学学虚拟机,那就行动起来,在经历了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官网下载压缩包]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eeLHrpCv-1588580749455)(media/15882998376518/15884079666032.jpg)]

    点击右侧的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但是这个文件暂时是没有用的,

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLUbhR8h-1588580749459)(media/15882998376518/15885781454606.jpg)]

    这里的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模式下才有用。其主要作用是方便开发人员调试解释器,因为目前的字节码都是用的模板解释器,在运行时生成汇编代码,所以我们无法设置断点。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOVNbkhZ-1588580749460)(media/15882998376518/15885786206309.jpg)]

    借用一下别人的jvm生命周期的时序图。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jF6OQj8X-1588580749462)(media/15882998376518/294879-20190122124631604-1730328352.jpg)]

    如果需要编译生成新的JDK,避免文件缺失,需要修补CMakeLists.txt,网上有关于这个的文件补全资源,可以对照这里的src/java-11-openjdk/CMakeLists.txt来看**[? 修补文件]**


? 前言
? Android 知识栈
? JVM 快速排序篇
? NO.2 内存区域&回收算法
? NO.3 垃圾收集器&ClassLoader
? NO.4 原子&线程