極客時間-左耳聽風-程序員攻略-Java底層知識
Java 字節碼相關
字節碼編程,也就是動態修改或是動態生成 Java 字節碼。Java 的字節碼相當於匯編,其中的一些細節。
- Java Zone: Introduction to Java Bytecode ,這篇文章圖文並茂地講述了 Java 字節碼的一些細節。
- IBM DeveloperWorks: Java bytecode ,講 Java 字節碼的文章。
- Java Bytecode and JVMTI Examples,這是一些使用 JVM Tool Interface 操作字節碼的比較實用的例子。包括方法調用統計、靜態字節碼修改、Heap Taggin 和 Heap Walking。
不使用 JVMTI 操作字節碼,而是用一些更好用的庫。這裏有三個庫可以比較容易地做這個事。
- asmtools - 用於生產環境的 Java .class 文件開發工具。
- Byte Buddy - 代碼生成庫:運行時創建 Class 文件而不需要編譯器幫助。
- Jitescript - 和 BiteScript 類似的字節碼生成庫。
Byte Buddy,在 2015 年還獲了 Oracle 的 “Duke’s Choice”大獎,其中說 Byte Buddy 極大地發展了 Java 的技術。
使用字節碼編程可以玩出很多高級玩法,最高級的還是在 Java 程序運行時進行字節碼修改和代碼註入。這個方式使用 Java 這門靜態語言在運行時可以進行各種動態的代碼修改,而且可以進行無侵入的編程。
Java Agent 的技術。Java Agent 使用的是 “Java Instrumentation API”,其主要方法是實現一個叫 premain()
的方法(嗯,一個比 main()
函數還要超前執行的 main 函數),然後把你的代碼編譯成一個 jar 文件。在 JVM 啟動時,使用這樣的命令行來引入你的 jar 文件:java -javaagent:yourAwesomeAgent.jar -jar App.jar
。
更為詳細的文章可以參看:“Java Code Geeks: Java Agents”
示例項目:jvm-monitoring-agent 或是 EntryPointKR/Agent.java。
如果想用 ByteBuddy 來玩,你可以看看這篇文章 “通過使用 Byte Buddy,便捷地創建 Java Agent”。
學習如何用 Java Agent 做監控,項目 Stage Monitor。
JVM 相關
Java 底層知識中另一個非常重要的內容——JVM。
JVM 的規格說明書,Java 8 的, The Java Virtual Machine Specification Java SE 8 Edition 。
中文翻譯,GitHub Repo - “java-virtual-machine-specification”。
JVM Anatomy Park JVM 解剖公園,帶你一點一點地把 JVM 中的一些技術解開。
學習 Java 底層原理還有 Java 的內存模型,官方文章是 JSR 133。還有馬裏蘭大學的威廉·皮尤(William Pugh)教授收集的和 Java 內存模型相關的文獻 - The Java Memory Model 。
內存方面兩篇文章。
- The JSR-133 Cookbook for Compiler Writers,解釋了怎樣實現 Java 內存模型,特別是在考慮到多處理器(或多核)系統的情況下,多線程和讀寫屏障的實現。
- Using JDK 9 Memory Order Modes,講了怎樣通過 VarHandle 來使用 plain、opaque、release/acquire 和 volatile 四種共享內存的訪問模式,並剖析了底層的原理。
垃圾回收機制 《The Garbage Collection Handbook》,這本書非常全面地介紹了垃圾收集的原理、設計和算法。但是這本書也是相當難啃的。中文翻譯《垃圾回收算法手冊》
調優垃圾回收, Garbage Collection Tuning Guide ,它是 Hotspot Java 虛擬機的垃圾回收調優指南。
Quick Tips for Fast Code on the JVM 裏面有寫出更快的 Java 代碼的幾個小提示。
小結
Java 最黑科技的玩法就是字節碼編程,也就是動態修改或是動態生成 Java 字節碼。Java 的字節碼相當於匯編。
一般不使用 JVMTI 操作字節碼,而是用一些更好用的庫,如 asmtools、Byte Buddy 和 BiteScript 等。使用字節碼編程可以玩出很多高級玩法,其中最高級的玩法是在 Java 程序運行時進行字節碼修改和代碼註入。
Java Agent 技術更好地實現這種高級玩法。
JVM 也是學習 Java 過程中非常重要的一部分內容。閱讀JVM 的規格說明書是系統了解 JVM 規範的最佳文檔, JVM Anatomy Park 系列文章,也非常值得一讀。
Java 的內存模型和垃圾回收機制,出了如何調優垃圾回收方面的資料。
極客時間-左耳聽風-程序員攻略-Java底層知識