深入理解JVM字节码

张亚
前言 为什么要写这本书 大约四五年前,秉承“代码未动、监控先行”的理念,我开始在公司的平台部门做服务质量监控平台。最开始是使用人工埋点的方式来进行监控信息的上报,业务方的接入成本非常高,上线前需要花半天到一天的时间来进行埋点,苦不堪言。 后来公司大力推行DevOps、容器化、微服务,提高了开发和运维效率,但分布式部署架构带来的问题也迅速显现出来,如服务拓扑不清、服务依赖关系复杂、日志散落在各个微服务中,等等。在出现问题时,开发人员不知道如何排查,无法快速定位问题。后来我了解到javaagent+ASM这样的技术能够自动注入埋点的代码,于是花了大概一个月的时间苦学字节码、ASM相关的知识。ASM官方的英文手册读了不下5遍,深知其中的难点。另外,APM这一套性能监控工具需要极高的可靠性和极低的性能损耗,倒逼着我对字节码的执行原理、高性能Java等有了更深入的研究。 我花了大概3个月的时间从零到一实现了整套无侵入字节码注入APM系统,对整个后端微服务调用栈进行监控,实现了业务方零埋点、跨进程异构系统的调用链路追踪、性能问题代码级别定位、业务拓扑实时发现、SLA实时统计等功能。该系统上线运行了几年,至今未出现问题。 我平时喜欢破解一些软件,一开始都是通过直接修改类文件的方式来进行的,比较烦琐。掌握了javaagent、ASM、JVMTI这些工具以后,对软件破解有了更深入的研究。 后来从平台部门去业务部门带领更大的团队,很早期的时候就引入了Kotlin来进行后端开发。为了避免基础较差的同事误解语法糖的意思,我对Kotlin中很多语法背后的实现做了详细的分析,让他们在使用的时候更加清楚语法糖的实现原理。 一路走来,觉得越底层的知识越有价值,所以想写一本这样的书,让更多的人能够对JVM字节码底层的细节多一些了解,在遇到问题时能自己分析、独立判断。 读者对象 希望你可以通过阅读本书知其然…