摘要:最黑科技的玩法就是字節碼編程,也就是動態修改或是動態生成字節碼。使用字節碼編程可以玩出很多高級玩法,其中最高級的玩法是在程序運行時進行字節碼修改和代碼注入。
這個是我訂閱 陳皓老師在極客上的專欄《左耳聽風》,我貼出來是為了自己以后方便學習和記憶,同時也分享給你們一起學習,當然如果有興趣,可以去訂閱,為了避免廣告嫌疑,我這就不多說了!以下第一人稱是指陳皓老師。
想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你!
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,你有必要讀一下 JVM 的規格說明書,我在這里放一個 Java 8 的, The Java Virtual Machine Specification Java SE 8 Edition 。對于規格說明書的閱讀,我認為是系統了解 JVM 規范的最佳文檔,這個文檔可以讓你對于搞不清楚或是詭異的問題恍然大悟。關于中文翻譯,有人在 GitHub 上開了個 Repo - “java-virtual-machine-specification”。
另外,也推薦一下 JVM Anatomy Park JVM 解剖公園,這是一個系列的文章,每篇文章都不長,但是都很精彩,帶你一點一點地把 JVM 中的一些技術解開。
學習 Java 底層原理還有 Java 的內存模型,官方文章是 JSR 133。還有馬里蘭大學的威廉·皮尤(William Pugh)教授收集的和 Java 內存模型相關的文獻 - The Java Memory Model ,你可以前往瀏覽。
對于內存方面,道格·利(Doug Lea)有兩篇文章也是很有價值的。
The JSR-133 Cookbook for Compiler Writers,解釋了怎樣實現 Java 內存模型,特別是在考慮到多處理器(或多核)系統的情況下,多線程和讀寫屏障的實現。
Using JDK 9 Memory Order Modes,講了怎樣通過 VarHandle 來使用 plain、opaque、release/acquire 和 volatile 四種共享內存的訪問模式,并剖析了底層的原理。
垃圾回收機制也是需要好好學習的,在這里推薦一本書 《The Garbage Collection Handbook》,在豆瓣上的得分居然是 9.9(當然,評價人數不多)。這本書非常全面地介紹了垃圾收集的原理、設計和算法。但是這本書也是相當難啃的。中文翻譯《垃圾回收算法手冊》翻譯得很一般,有人說翻譯得很爛。所以,如果可能,還是讀英文版的。如果你對從事垃圾回收相關的工作有興趣,那么你需要好好看一下這本書。
當然,更多的人可能只需要知道怎么調優垃圾回收, 那么推薦讀讀 Garbage Collection Tuning Guide ,它是 Hotspot Java 虛擬機的垃圾回收調優指南,對你很有幫助。
Quick Tips for Fast Code on the JVM 也是一篇很不錯的文章,里面有寫出更快的 Java 代碼的幾個小提示,值得一讀。
小結好了,總結一下今天學到的內容。Java 最黑科技的玩法就是字節碼編程,也就是動態修改或是動態生成 Java 字節碼。Java 的字節碼相當于匯編,學習其中的細節很有意思,為此我精心挑選了 3 篇文章,供你學習。我們一般不使用 JVMTI 操作字節碼,而是用一些更好用的庫,如 asmtools、Byte Buddy 和 BiteScript 等。使用字節碼編程可以玩出很多高級玩法,其中最高級的玩法是在 Java 程序運行時進行字節碼修改和代碼注入。同時,我介紹了 Java Agent 技術,幫助你更好地實現這種高級玩法。
JVM 也是學習 Java 過程中非常重要的一部分內容。我推薦閱讀一下 JVM 的規格說明書,我認為,它是系統了解 JVM 規范的最佳文檔,可以讓你對于搞不清楚或是詭異的問題恍然大悟。同時推薦了 JVM Anatomy Park 系列文章,也非常值得一讀。
隨后介紹的是 Java 的內存模型和垃圾回收機制,尤其給出了如何調優垃圾回收方面的資料。這些內容都很底層,但也都很重要。對于想成為高手的你來說,還是有必要花時間來啃一啃的。
你的點贊是我持續分享好東西的動力,歡迎點贊!
一個笨笨的碼農,我的世界只能終身學習!
歡迎加入前端大家庭,里面會經常分享一些技術資源。文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72509.html
摘要:下面我們從前端基礎和底層原理開始講起。對于和這三個對應于矢量圖位圖和圖的渲染來說,給前端開發帶來了重武器,很多小游戲也因此蓬勃發展。這篇文章受眾之大,后來被人重新整理并發布為,其中還包括中文版。 showImg(https://segmentfault.com/img/bVbjM5r?w=1142&h=640); 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 這...
摘要:,美國著名程序員風險投資家博客和技術作家。,從年以來,獲獎的計算機科學方面的論文收集。截至年月,已收集超過萬篇預印本。其中的分類可以認為也是一個論文的集散地。 showImg(https://segmentfault.com/img/bVbjVFa?w=1142&h=640); 這個是我訂閱 陳皓老師在極客上的專欄《左耳聽風》,我整理出來是為了自己方便學習,同時也分享給你們一起學習,當...
摘要:,谷歌給的一份性能指南和最佳實踐。目前而言,前端社區有三大框架和。隨后重點講述了和兩大前端框架,給出了大量的文章教程和相關資源列表。我認為,使用函數式編程方式,更加符合后端程序員的思路,而是更符合前端工程師習慣的框架。 showImg(https://segmentfault.com/img/bVbjQAM?w=1142&h=640); 這個是我訂閱 陳皓老師在極客上的專欄《左耳聽風》...
閱讀 1542·2023-04-26 00:20
閱讀 1132·2023-04-25 21:49
閱讀 814·2021-09-22 15:52
閱讀 587·2021-09-07 10:16
閱讀 979·2021-08-18 10:22
閱讀 2676·2019-08-30 14:07
閱讀 2246·2019-08-30 14:00
閱讀 2661·2019-08-30 13:00