深入 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 小章节,把可能遇到的情况列了出来。
我在书籍和网上没找到解决办法的时候,就是靠着这个编译成功的。
编译之后,就可以愉快的 Debug 了,特别是当你下载CLion。JetBrains 的全家桶系列操作体验都一样,就和 Java 开发的使用类似,能一头扎进 JDK 的海洋里看个究竟了。
比如我们对 线程创建感兴趣,加个断点,你会看到许多你之前在执行 jstack 时才能见到的名字,都出现在这里,有没有遇到熟人的感觉?哈哈
实际我们自己在代码里要创建一个线程,调用流程更复杂,你会看到InstanceKlass, JavaCalls 等等,这些又是做什么的呢?就像毛衣破了一个洞,本想拉个线头,结果...
在繁杂的代码和功能里,要有头绪的阅读也不太容易,除非一开始目标明确,有的放矢。
我之前阅读的华章这本 JVM 书籍『深入解析 Java 虚拟机 HotSpot』,感觉不错。
从类的加载、解析与初始化,对象的创建、运行时等都做了源码层面的介绍。在并发设施方面还对内存模型、锁的优化, 不同粒度的锁都原理和源码层级的介绍。
此外,对于编译方面,也重点介绍了 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。每天抽一本。
送书方式:为防止刷赞等行为,本次改为群内红包的方式,手气最佳者得之。
请添加微信进群:
相关阅读
自制Spring大神 Josh Long 同款命令行工具,值得拥有
源码|实战|成长|职场
这里是「Tomcat那些事儿」
请留下你的足迹
我们一起「终身成长」