1. 程式人生 > >極客時間-左耳聽風-程序員攻略-Java底層知識

極客時間-左耳聽風-程序員攻略-Java底層知識

ots 字節 class 動態生成 pen pre 屏障 好用 nts

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底層知識