歷時將近一年,個人第一本書《深刻理解 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 字節碼技術內容很是龐大,本書的內容只是揭開了冰山一角。但願能夠經過本書達到授之以漁的效果,讀者朋友若是能夠經過閱讀本書掌握一些工具和方法,觸類旁通的解決開發過程當中實際的問題,那我就很是知足了。
我畫了一張這本書思惟導圖方便了你理解,以下圖所示。
最後感謝出版社的福川、李藝老師,還有給我寫推薦語的榮哥、老錢、成哥、周志明大哥。
如今在噹噹和京東都上線了,放兩個連接吧。
京東
噹噹