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

Tomcat那些事儿

共 2145字,需浏览 5分钟

 ·

2021-11-23 20:00

我估计不少 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。每天抽一本。

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


请添加微信进群:



相关阅读

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

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

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

怎样阅读源代码?





源码|实战|成长|职场


这里是「Tomcat那些事儿

请留下你的足迹

我们一起「终身成长」




浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报