我的第一本书《深入理解 JVM 字节码》出版啦

11,954 阅读7分钟

历时将近一年,我的第一本书《深入理解 JVM 字节码》终于出版了。

这本书的思路来源是掘金的小册子《JVM 字节码从入门到精通》,这本小册是我的第一个技术专栏,也是抱着为自己总结的心态把自己在 JVM 字节码的知识沉淀一下。在掘金上线后,虽然销量一般,但是我收获了很多的意见,看到了很多知识体系不全面的问题。后面机缘巧合和机械工业出版社搭线上,于是有了这本书。

写书的过程还是比较黑暗的,在 Notion 上给自己列了一个交付的计划。

跟写代码一样,估时过于乐观,开始写了才知道水真的是好深,打磨内容、排版、校对都是一个体力活。写完整本以后,又花了将近两个月修改完善稿件。在小册上线以后,花了将近半年的时间没日没夜的来完成整本书稿,交给出版社。

为什么要写这本书

大约四五年前,秉承着“代码未动、监控先行”的理念,我在公司的平台部门开始做服务质量监控平台。最开始的方式是使用人肉埋点的方式来进行监控信息的上报,业务方的接入成本非常高,上线前需要花半天到一天的时间来进行埋点,苦不堪言。

后面公司大力推行 devops、容器化、微服务,提高了开发及运维效率,不过同时分布式部署架构带来的问题就会迅速显现出来,服务拓扑不清、服务依赖关系复杂、日志散落在各个微服务。在线上出现问题时,开发不知道如何排查,无法快速定位问题。后来我了解到 javaagent + ASM 这样的技术能够自动注入埋点的代码,花了大概一个月的时间苦学字节码、ASM 相关的知识,ASM 那本官方的英文手册读了不下 5 遍,深知其中的难点。另外 APM 这一套性能监控工具需要极高的可靠性和极低的性能损耗,倒逼着我对字节码执行原理、高性能 Java 方面有了更深的研究。

我花了大概 3 个月多月的时间一个人从零到一实现了整套无侵入字节码注入 APM 系统,对整个后端微服务调用栈做了监控,实现了业务方零埋点、扩进程异构系统的调用链路追踪、性能问题代码级别定位、业务拓扑实时发现、SLA 实时统计等功能,上线运行了几年未出现过什么问题。

平时喜欢折腾 pojie 一些东西,一开始都是采用直接修改类文件的方式来处理的,比较繁琐。后来掌握了 javaagent、ASM、JVMTI 这些工具以后,一发不可收拾,抱着学习的目的无痛 pojie 了 censum、gceay、fastthread、heaphero、ELK 等商业软件,觉得还是蛮有成就感的。

后来从平台部门去业务部门带了更大的团队,很早期的时候就引入了 Kotlin 来进行后端开发。因为对语法糖背后的知识非常匮乏,基础较差的同学经常误解一些语法糖的意思,针对这个情况,我对 Kotlin 中大量语法背后的实现对他们做了详细的分析,让他们在使用的时候更加清楚背后发生了什么。

一路走过来,觉得越底层的知识越是有价值,所以想写一本这样的书,让更多的人能够对 JVM 字节码底层的细节多一些了解,在遇到问题时能动手分析,有自己独立的判断。

读者对象

通过阅读本书希望你可以从知其然到知其所以然,理解炫酷语法糖和高级框架背后的实现原理、实现各种 JVM 黑科技,真正搞懂反射、Lambda 表达式、AOP、热加载、软件 pojie 等背后的实现细节。

本书适合以下读者阅读。

  • 对 Java 有了初步了解,想深入学习内部运行细节的读者
  • 通过学习字节码改写技术实现高性能框架的读者
  • 对 APM 感兴趣,想了解 APM 实现原理和搭建 APM 系统做分布式系统调用链跟踪的读者
  • 想学习 Java 系软件常见的 pojie 和防 pojie 方法,提高自身软件逆向和 pojie 门槛的读者

如何阅读这本书

本书一共有 12 章,主要分为字节码原理和应用篇两大部分内容。

第 1 章详细剖析了 class 文件的内部结构,介绍这一部分内容是为了让读者更容易理解本书后面的介绍字节码原理。

第 2 章一开始介绍了字节码是什么,接下来介绍了 Java 虚拟机栈和栈帧相关的内容,然后通过 for 循环、switch-case、try-catch-finally 等语法讲解了字节码指令的用法。

第 3 章我们介绍了字节码的进阶知识,主要目的是让读者掌握方法调用指令、泛型擦除、synchronized 关键字、反射的底层实现原理。

第 4 章介绍了 Javac 编译器的原理,编译原理是计算机科学皇冠上的明珠,只有弄懂了 Javac 才能更好的理解字节码生成的原理。这个章节一开始介绍了 Javac 源码调试的方法,随后详细介绍了 Javac 编译的七大阶段和各阶段的作用。

第 5 章介绍了从字节码角度看 Kotlin 语言,介绍了常见语法糖、coroutine 等原理,希望读者朋友可以举一反三,在学习其他 JVM 系语言时可以使用类似的思路。

第 6 章介绍了 ASM 和 Javassist 这两个字节码操作工具,这两个工具非常重要,被大量的中间件框架使用,后面 APM、软件 pojie 章节都涉及这两个工具的使用。

第 7 章介绍了 Java Instrumentation 的原理,分两种使用方式讲解了 Instrumentation 的使用,最后介绍了 Attach API 的底层 Unix 域套接字通信原理。

第 8 章介绍了 JSR 269 插件化注解处理原理,希望读者可以通过学习这一章掌握编译期间修改生成、修改代码的方法,理解 Lombok、ButterKnife 工具背后的实现原理。

第 9 章主要介绍了字节码在 cglib、Fastjson、Dubbo、Jacoco、Mock 这些框架上的应用,可以让读者接触到更多字节码的使用场景。

第 10 章主要介绍了反编译、 pojie 、防 pojie 和逆向工程相关的内容,介绍这一章的内容不是教如何 pojie 别人的付费软件,而是通过了解常见的 pojie 和逆向方法更好的保护自己的软件产品。

第 11 章介绍了 APM 的概况、分布式跟踪的基本原理、OpenTracing 的基本概念和无埋点字节码插桩的代码实现,如果对 APM 有兴趣的读者可以阅读本章作为入门,实现自己的 APM 产品。

第 12 章详细介绍了安卓 dex 文件的组成结构,安卓字节码指令与 Java 字节码指令的区别,最后介绍了 Gradle 字节码改写实现无侵入插桩的方法。

JVM 字节码技术内容非常庞大,本书的内容只是揭开了冰山一角。希望可以通过本书达到授之以渔的效果,读者朋友如果可以通过阅读本书掌握一些工具和方法,举一反三的解决开发过程中实际的问题,那我就非常满足了。

我画了一张这本书思维导图方便了你理解,如下图所示。

感谢

最后感谢出版社的福川、李艺老师,还有给我写推荐语的荣哥、老钱、成哥、周志明大哥。