深入 Java 虚拟机HotSpot 源码的书籍,这本不错

我估计不少 Java 技术栈的同学有阅读源代码的习惯,特别是 JDK 自带的那些源码。在 IDE 里点击跳转就能看明白,在 JDK 内部各种数据结构是怎样实现的,各种线程安全在 Java 层面是怎样实现的, String、Integer 这些默认的基础类型是怎样设计的等等。

之后不久,有些人不止步于此,会想着更深入去了解一些内容,看看这些 Java 应用在 JVM 里到底是怎么样跑起来的,Java 的线程和操作线程又是怎么样关联起来的,实现上到底是 1:1 还是 M:N 呢?甚至 JVM 层面的一些原理,像 GC 的逻辑,Hotspot 的 Hot 是如何认定的,编译器又是怎样做的优化......

而与使用众多的 HotSpot 同源的 OpenJDK ,应该是第一选择。庞大的开源项目,你会选择从哪入手呢?

在很早之前的文章里,我表达过一些我阅读开源项目的思路和方法

读源码时,我们到底在读什么?

源码面前,了无秘密

对于 JVM 源码,我之前一直都是静态的看,理解一些实现思路,以及从JDK 自带的一些工具的 Java 源码中,了解一些可以借鉴的使用细节。这么多年使用 Java 开源项目,当然知道跑起来观察,能 Debug 体验更好,心里虽明白,不过一直畏难也懒的动手。今年秋天,在翻看华章的一本 JVM 书籍时,想着自己编译一个JDK 试了一试。

话说看过不少的 JVM 相关书籍,基本都会在第一章介绍从源码构建自己的JDK。如果没真下手的时候,光看看热闹,好像也是执行几条命令就成了。

真动手的时候,电脑的操作系统、系统版本、硬件、甚至编译工具等等的区别,都会导致编译过程出现问题。

不过除了书籍,网上的各类前人的经验可供参考外,OpenJDK 源码里也预想到了这个工作的不易。所以在源码里带了一个「帮手」。在doc/building.html   文件内,有个 troubleshooting 小章节,把可能遇到的情况列了出来。

3c10f601af2e4b89e1f4b46ee8e4ed48.png

我在书籍和网上没找到解决办法的时候,就是靠着这个编译成功的。

编译之后,就可以愉快的  Debug 了,特别是当你下载CLion。JetBrains 的全家桶系列操作体验都一样,就和 Java 开发的使用类似,能一头扎进 JDK 的海洋里看个究竟了。

8efbe09b9a377ce9becc44658af1eef5.png

比如我们对 线程创建感兴趣,加个断点,你会看到许多你之前在执行 jstack 时才能见到的名字,都出现在这里,有没有遇到熟人的感觉?哈哈

a9b5f67b90ddfebb4a8f050982203537.png

实际我们自己在代码里要创建一个线程,调用流程更复杂,你会看到InstanceKlass, JavaCalls 等等,这些又是做什么的呢?就像毛衣破了一个洞,本想拉个线头,结果...

da829cd9fb4e1d05f5195c6fecfef68d.png

在繁杂的代码和功能里,要有头绪的阅读也不太容易,除非一开始目标明确,有的放矢。

我之前阅读的华章这本 JVM 书籍『深入解析 Java 虚拟机 HotSpot』,感觉不错。

86087cf35cdedbc3a3967a52b7f0bc94.png

从类的加载、解析与初始化,对象的创建、运行时等都做了源码层面的介绍。在并发设施方面还对内存模型、锁的优化, 不同粒度的锁都原理和源码层级的介绍。

此外,对于编译方面,也重点介绍了 C1 和 C2 的编译器,从编译流程到代码优化的一些方式等。以及垃圾回收部分,从不同垃圾收集器的角度,结合一些源码,对 GC 的工作与实现也做了说明。

比如上面的截图里,关于用户线程的创建,我们看到调用栈中有对于 JavaCalls的使用。那什么是 JavaCalls。这是一种用于 HotSpot VM 用来调用 Java 方法的实现方式,就像 Java 通过 JNI 来请求虚拟机方法一样。Java 线程会在入口后使用 JavaCalls 执行 Java 方法的 Thread.run()。

再说说并发设施相关的,我们常用的并发包,以及一些Java 工具类框架的实现,都基本用到了Unsafe类。而且我们自己在执行  jstack 看到的线程栈时,有时常会看到 Unsafe.park 之类的内容,这些在 JUC 的 LockSupport 中被使用并以此出现了AQS 等等,这背后的 Park 是什么,怎样工作的?书里结合源码,分析了 ParkEvent的实现,Parker 等的实现。关键代码版段中包含部分注释, 对于源码阅读和学习的朋友来说,是个不错的指引。

当然,对于书籍来说,我个人认为对于JVM 的门外汉,能再补充一些内容,一些概念再展开讲讲就更赞了。


感谢华章出版社友情赞助,本次送出本文提到的书籍本。

截止时间 11.25 中午12:00。每天抽一本。

送书方式:为防止刷赞等行为,本次改为群内红包的方式,手气最佳者得之。

请添加微信进群:

45e5002d170d60510e230646fe6f0c74.png

相关阅读

你真的会高效的在GitHub搜索开源项目吗?

80%的程序员都不了解的调试技巧

自制Spring大神 Josh Long 同款命令行工具,值得拥有

怎样阅读源代码?

5ef19595d9b16d0a7515d4d5c66be4c0.png

源码|实战|成长|职场

这里是「Tomcat那些事儿」

请留下你的足迹

我们一起「终身成长」

1fbbceb726b54c33f6d618665d863ff2.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值