历时将近一年,个人第一本书《深刻理解 JVM 字节码》终于出版了。java
这本书的思路来源是掘金的小册子《JVM 字节码从入门到精通》,这本小册是个人第一个技术专栏,也是抱着为本身总结的心态把本身在 JVM 字节码的知识沉淀一下。在掘金上线后,虽然销量通常,可是我收获了不少的意见,看到了不少知识体系不全面的问题。后面机缘巧合和机械工业出版社搭线上,因而有了这本书。json
写书的过程仍是比较黑暗的,在 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 等背后的实现细节。
本书适合如下读者阅读。
本书一共有 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 字节码技术内容很是庞大,本书的内容只是揭开了冰山一角。但愿能够经过本书达到授之以渔的效果,读者朋友若是能够经过阅读本书掌握一些工具和方法,触类旁通的解决开发过程当中实际的问题,那我就很是知足了。
我画了一张这本书思惟导图方便了你理解,以下图所示。
最后感谢出版社的福川、李艺老师,还有给我写推荐语的荣哥、老钱、成哥、周志明大哥。
如今在当当和京东都上线了,放两个连接吧。
京东
当当