怎么 debug JDK 源码?
Posted Java技术栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么 debug JDK 源码?相关的知识,希望对你有一定的参考价值。
点击关注公众号,Java干货及时送达
0. 写在前面
今天给大家分享下如何在搭建一套你自己的 Java 源码学习环境。它有啥用呢?我认为最大的作用就是你可以一边 debug 源代码,情到深处时可以直接写下你当时的一个理解。
![](https://image.cha138.com/20211110/cc252701761e44d9bd1c3970d10a48f9.jpg)
不知道你有没有这种体验,很多时候我们看懂了,总以为自己能记住,结果可能过了两天就忘记了。这也应了那句古话,好记性不如烂笔头。学习 JDK 源码也是一样的道理,比如你心血来潮去研究了下 ArrayList、HashMap、阻塞队列、ConcurrentHashMap、锁等最常用工具类的具体实现,一步步调试后终于顿悟了,这个时候你肯定想把自己的成果写到源码的对应位置,下次再看可就轻松多了。
就算写错了,时隔几年偶然再看时,也能看到当年初出茅庐的那个你的青涩,或许你还会微微一笑,被当年那个挑灯夜战努力的你所触动。
![](https://image.cha138.com/20211110/4c1c65035d284164902ca996da729fd7.jpg)
直接去跟源码都是进入到编译后的 *.class
文件的,并不能让你写写画画, 为了可以让你记录自己的成长,留着以后缅怀,七哥今天带你手把手配置一套自己 oracleJDK 17 的源码阅读环境。
配置很简单,跟着一步步操作可以了,具体 JDK 的版本看你自己选择,区别只在于下载时选择不同的 JDK 版本。
工具介绍:
oracleJDK 17
IntellJ IDEA 2021.2
1. 下载JDK,获取源码压缩包
如果你本地已经安装了JDK,并且你就是想搭建已安装JDK版本的源码阅读环境,这里就不用下载了,我今天选择重新下载 oracleJDK17,这是目前最新的长期支持版本,可以用来学习最新的特性嘛。
Mac上查找你本地安装JDK的路径可以使用命令:/usr/libexec/java_home -V
![](https://image.cha138.com/20211110/bab91d53f4054b43a4d00497c4c665bc.jpg)
下载地址:https://www.oracle.com/java/technologies/downloads/#jdk17-windows
![](https://image.cha138.com/20211110/5eff22fee69c4ee9bb64dc5f9c2c0097.jpg)
我们选择 .zip 结尾的免安装版本,下载后直接解压,然后找到解压缩后 lib 目录中的 src.zip
,这个就是我们需要的源码压缩包。你如果已经安装了 JDK,就直接去 JDK 的安装目录下 lib 目录中找到 src.zip ,都是一样的操作。
![](https://image.cha138.com/20211110/5f147dbfe89b4cf8b572f226b493101d.jpg)
记着这个位置,后面我们会用到哈😄
最新面试题整理好了,点击Java面试库小程序在线刷题。
2. 创建IDEA项目
在 IDEA 中创建一个简单的 Java 项目,顶部栏 File -> New -> Project…
![](https://image.cha138.com/20211110/eeb217d457b8432ab365bf2f58734f6a.jpg)
创建一个Java空项目,直接 next:
![](https://image.cha138.com/20211110/ebc7fc83888c4a8c8dab703fa196d596.jpg)
名字看你喜欢取就行:
![](https://image.cha138.com/20211110/36f667a5ee68469babce2b01c9016cba.jpg)
3. 解压源码包到IDEA项目中
找到第一步中的 src.zip
源码包,解压到你的项目目录中。我的是在项目的根目录中新建了 jdk17 文件夹,准备将源码解压到这里。
解压完成后的结构如下:
![](https://image.cha138.com/20211110/2c5b9c248d0747ea98cce50f54422a8c.jpg)
到这其实我们就可以查看 *.java
后缀的源代码了:
![](https://image.cha138.com/20211110/a44a3fa633024064b4c9c535bb303e2d.jpg)
但是这样肯定是不够的,我们看源码最重要的还是要靠 debug 调试,现在这样 debug 还是会进入到 jdk 自带的压缩后的源码,这个源码是来自于 src.zip,编辑器中显示是带锁的,无法编辑。
那肯定不行了,别急接下往下看。
最新面试题整理好了,点击Java面试库小程序在线刷题。
4. 配置调试时进入可编辑的源码
通过这一步的配置我们就可以一边调试一边写注释了,每次 debug 进入的都是不断完善写过注释的源码,这种 feel 倍儿爽😁
需要如下几步,我们继续搞起~
IDEA配置调试时允许单步进入
JDK 源码是受保护的,无法直接通过 F7 (step into),可以通过 alt+shift+F7 (force step into),需要我们在 IDEA 中取消以下限制,就可以直接通过 F7 进入源码了。
![](https://image.cha138.com/20211110/0e2166b04fea4a9f9cb8a48cebad7d18.jpg)
设置当前项目关联解压后的源码
既然默认项目调试进入的源码是 JDK 目录下 src.zip 包中的源代码,那么这里我就需要修改下项目关联的 JDK。
点击关注公众号,Java干货及时送达
Project Structure -> SDKs 下 新建SDK:
![](https://image.cha138.com/20211110/32632b46617b4d658853ca17c694c5cd.jpg)
还是先选择我们下载的 JDK17 的 Home 目录:
![](https://image.cha138.com/20211110/bb5fea0c38c74d71bcbfc7e7aab69091.jpg)
名字设置为 jdk17-source
(根据你的喜好命名即可)。然后选择 jdk17-source
的 Sourcepath
选项,将源码关联目录删掉。
command+a
全选后删除:
![](https://image.cha138.com/20211110/6e27590f04f84dbd8302a32cd431741a.jpg)
然后点击 + 新增,选择我们当前项目中解压后的源码目录:
![](https://image.cha138.com/20211110/9ec1ae0c75aa43bda3c3d806606598ac.jpg)
导入成功后,点击ok即可:
![](https://image.cha138.com/20211110/e558e822476f463a95f916c37660a720.jpg)
然后设置当前项目的 JDK 为我们新增的 jdk17-source
:
![](https://image.cha138.com/20211110/5026d408f39242c2b3fa08db1459f0d2.jpg)
至此,大功告成!你是否已经迫不及待的想要调试看看啦,我们搞起!
5. debug 调试
此时,我们只需要在 src 目录下写我们的测试代码就好了,打上断点,可劲的钻研吧,少年!
![](https://image.cha138.com/20211110/48b2d5ef7d9d49ac83ec77ad5c9e0a2f.jpg)
单步调试就会进入到我们解压缩后的源码文件,可以自由的写写画画:
![](https://image.cha138.com/20211110/79e7876a97124a0b960bf42f06c2211e.jpg)
6. 可能遇到的问题
我按照上面这个步骤搞下来是没有遇到啥问题的,这里记录下可能遇到的问题,一次性搞定肯定是最好的,有报错的可以看看。
编译 OOM
增加IDEA编译所需堆内存,默认700,这里改为1024。
![](https://image.cha138.com/20211110/3ff8086fa7894f4bb4a3e16fd5cc5535.jpg)
7. 上传到 github
这一步是为了可以让你在家里和公司的电脑上都可以获取到你注释过的源代码,同时在工作中遇到的问题,排查后有新的理解也可以及时同步到远程仓库,方便多端同步维护嘛~
首先在 github 新建一个和本地项目名一致的仓库,然后给本地项目git初始化后关联远程仓库即可。
进入到本地源码项目根目录中依次执行如下命令:
git init
# git remote add 远程仓库名,名称唯一即可 远程仓库地址
git remote add origin https://gitee.com/isevenluo/oracle-jdk17-source-learn.git
# 查看关联的所有的远程仓库名称及地址
git remote -v
# 查看所有的远程仓库名称
git remote
# 提交本地仓库分支(master) 给远程仓库(origin)分支(master) 此处是强制提交
git push origin master -f
# 查看当前未提交的内容,此时应该为空
git status
写在最后
今天给大家分享了如何在本地搭建一套JDK源码的阅读环境,我建议学习Java的同学都配置下,JDK的源码还是要读一读的,对你将会大有益处。加油吧,少年 🤙
关注Java技术栈看更多干货
获取 Spring Boot 实战笔记!
以上是关于怎么 debug JDK 源码?的主要内容,如果未能解决你的问题,请参考以下文章