摘要:最黑科技的玩法就是字節(jié)碼編程,也就是動態(tài)修改或是動態(tài)生成字節(jié)碼。使用字節(jié)碼編程可以玩出很多高級玩法,其中最高級的玩法是在程序運(yùn)行時(shí)進(jìn)行字節(jié)碼修改和代碼注入。
這個(gè)是我訂閱 陳皓老師在極客上的專欄《左耳聽風(fēng)》,我貼出來是為了自己以后方便學(xué)習(xí)和記憶,同時(shí)也分享給你們一起學(xué)習(xí),當(dāng)然如果有興趣,可以去訂閱,為了避免廣告嫌疑,我這就不多說了!以下第一人稱是指陳皓老師。
想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!
Java 字節(jié)碼相關(guān)首先,Java 最黑科技的玩法就是字節(jié)碼編程,也就是動態(tài)修改或是動態(tài)生成 Java 字節(jié)碼。Java 的字節(jié)碼相當(dāng)于匯編,其中的一些細(xì)節(jié)你可以從下面的這幾個(gè)教程中學(xué)習(xí)。
Java Zone: Introduction to Java Bytecode ,這篇文章圖文并茂地向你講述了 Java 字節(jié)碼的一些細(xì)節(jié),是一篇很不錯(cuò)的入門文章。
IBM DeveloperWorks: Java bytecode ,雖然這篇文章很老了,但是這篇文章是一篇非常好的講 Java 字節(jié)碼的文章。
Java Bytecode and JVMTI Examples,這是一些使用 JVM Tool Interface 操作字節(jié)碼的比較實(shí)用的例子。包括方法調(diào)用統(tǒng)計(jì)、靜態(tài)字節(jié)碼修改、Heap Taggin 和 Heap Walking。
當(dāng)然,一般來說,我們不使用 JVMTI 操作字節(jié)碼,而是用一些更好用的庫。這里有三個(gè)庫可以幫你比較容易地做這個(gè)事。
asmtools - 用于生產(chǎn)環(huán)境的 Java .class 文件開發(fā)工具。
Byte Buddy - 代碼生成庫:運(yùn)行時(shí)創(chuàng)建 Class 文件而不需要編譯器幫助。
Jitescript - 和 BiteScript 類似的字節(jié)碼生成庫。
就我而言,我更喜歡 Byte Buddy,它在 2015 年還獲了 Oracle 的 “Duke’s Choice” 大獎,其中說 Byte Buddy 極大地發(fā)展了 Java 的技術(shù)。
使用字節(jié)碼編程可以玩出很多高級玩法,最高級的還是在 Java 程序運(yùn)行時(shí)進(jìn)行字節(jié)碼修改和代碼注入。聽起來是不是一些很黑客,也很黑科技的事?是的,這個(gè)方式使用 Java 這門靜態(tài)語言在運(yùn)行時(shí)可以進(jìn)行各種動態(tài)的代碼修改,而且可以進(jìn)行無侵入的編程。
比如, 我們不需要在代碼中埋點(diǎn)做統(tǒng)計(jì)或監(jiān)控,可以使用這種技術(shù)把我們的監(jiān)控代碼直接以字節(jié)碼的方式注入到別人的代碼中,從而實(shí)現(xiàn)對實(shí)際程序運(yùn)行情況進(jìn)行統(tǒng)計(jì)和監(jiān)控。如果你看過我的《編程范式游記》,你就知道這種技術(shù)的威力了,其可以很魔法地把業(yè)務(wù)邏輯和代碼控制分離開來。
要做到這個(gè)事,你還需要學(xué)習(xí)一個(gè)叫 Java Agent 的技術(shù)。Java Agent 使用的是 “Java Instrumentation API”,其主要方法是實(shí)現(xiàn)一個(gè)叫 premain() 的方法(嗯,一個(gè)比 main() 函數(shù)還要超前執(zhí)行的 main 函數(shù)),然后把你的代碼編譯成一個(gè) jar 文件。
在 JVM 啟動時(shí),使用這樣的命令行來引入你的 jar 文件:
java -javaagent:yourAwesomeAgent.jar -jar App.jar。更為詳細(xì)的文章你可以參看:“Java Code Geeks: Java Agents”,你還可以看一下這個(gè)示例項(xiàng)目:jvm-monitoring-agent 或是 EntryPointKR/Agent.java。如果想用 ByteBuddy 來玩,你可以看看這篇文章 “通過使用 Byte Buddy,便捷地創(chuàng)建 Java Agent”。如果你想學(xué)習(xí)如何用 Java Agent 做監(jiān)控,你可以看一下這個(gè)項(xiàng)目 Stage Monitor。
JVM 相關(guān)接下來講講 Java 底層知識中另一個(gè)非常重要的內(nèi)容——JVM。
說起 JVM,你有必要讀一下 JVM 的規(guī)格說明書,我在這里放一個(gè) Java 8 的, The Java Virtual Machine Specification Java SE 8 Edition 。對于規(guī)格說明書的閱讀,我認(rèn)為是系統(tǒng)了解 JVM 規(guī)范的最佳文檔,這個(gè)文檔可以讓你對于搞不清楚或是詭異的問題恍然大悟。關(guān)于中文翻譯,有人在 GitHub 上開了個(gè) Repo - “java-virtual-machine-specification”。
另外,也推薦一下 JVM Anatomy Park JVM 解剖公園,這是一個(gè)系列的文章,每篇文章都不長,但是都很精彩,帶你一點(diǎn)一點(diǎn)地把 JVM 中的一些技術(shù)解開。
學(xué)習(xí) Java 底層原理還有 Java 的內(nèi)存模型,官方文章是 JSR 133。還有馬里蘭大學(xué)的威廉·皮尤(William Pugh)教授收集的和 Java 內(nèi)存模型相關(guān)的文獻(xiàn) - The Java Memory Model ,你可以前往瀏覽。
對于內(nèi)存方面,道格·利(Doug Lea)有兩篇文章也是很有價(jià)值的。
The JSR-133 Cookbook for Compiler Writers,解釋了怎樣實(shí)現(xiàn) Java 內(nèi)存模型,特別是在考慮到多處理器(或多核)系統(tǒng)的情況下,多線程和讀寫屏障的實(shí)現(xiàn)。
Using JDK 9 Memory Order Modes,講了怎樣通過 VarHandle 來使用 plain、opaque、release/acquire 和 volatile 四種共享內(nèi)存的訪問模式,并剖析了底層的原理。
垃圾回收機(jī)制也是需要好好學(xué)習(xí)的,在這里推薦一本書 《The Garbage Collection Handbook》,在豆瓣上的得分居然是 9.9(當(dāng)然,評價(jià)人數(shù)不多)。這本書非常全面地介紹了垃圾收集的原理、設(shè)計(jì)和算法。但是這本書也是相當(dāng)難啃的。中文翻譯《垃圾回收算法手冊》翻譯得很一般,有人說翻譯得很爛。所以,如果可能,還是讀英文版的。如果你對從事垃圾回收相關(guān)的工作有興趣,那么你需要好好看一下這本書。
當(dāng)然,更多的人可能只需要知道怎么調(diào)優(yōu)垃圾回收, 那么推薦讀讀 Garbage Collection Tuning Guide ,它是 Hotspot Java 虛擬機(jī)的垃圾回收調(diào)優(yōu)指南,對你很有幫助。
Quick Tips for Fast Code on the JVM 也是一篇很不錯(cuò)的文章,里面有寫出更快的 Java 代碼的幾個(gè)小提示,值得一讀。
小結(jié)好了,總結(jié)一下今天學(xué)到的內(nèi)容。Java 最黑科技的玩法就是字節(jié)碼編程,也就是動態(tài)修改或是動態(tài)生成 Java 字節(jié)碼。Java 的字節(jié)碼相當(dāng)于匯編,學(xué)習(xí)其中的細(xì)節(jié)很有意思,為此我精心挑選了 3 篇文章,供你學(xué)習(xí)。我們一般不使用 JVMTI 操作字節(jié)碼,而是用一些更好用的庫,如 asmtools、Byte Buddy 和 BiteScript 等。使用字節(jié)碼編程可以玩出很多高級玩法,其中最高級的玩法是在 Java 程序運(yùn)行時(shí)進(jìn)行字節(jié)碼修改和代碼注入。同時(shí),我介紹了 Java Agent 技術(shù),幫助你更好地實(shí)現(xiàn)這種高級玩法。
JVM 也是學(xué)習(xí) Java 過程中非常重要的一部分內(nèi)容。我推薦閱讀一下 JVM 的規(guī)格說明書,我認(rèn)為,它是系統(tǒng)了解 JVM 規(guī)范的最佳文檔,可以讓你對于搞不清楚或是詭異的問題恍然大悟。同時(shí)推薦了 JVM Anatomy Park 系列文章,也非常值得一讀。
隨后介紹的是 Java 的內(nèi)存模型和垃圾回收機(jī)制,尤其給出了如何調(diào)優(yōu)垃圾回收方面的資料。這些內(nèi)容都很底層,但也都很重要。對于想成為高手的你來說,還是有必要花時(shí)間來啃一啃的。
你的點(diǎn)贊是我持續(xù)分享好東西的動力,歡迎點(diǎn)贊!
一個(gè)笨笨的碼農(nóng),我的世界只能終身學(xué)習(xí)!
歡迎加入前端大家庭,里面會經(jīng)常分享一些技術(shù)資源。文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72509.html
摘要:下面我們從前端基礎(chǔ)和底層原理開始講起。對于和這三個(gè)對應(yīng)于矢量圖位圖和圖的渲染來說,給前端開發(fā)帶來了重武器,很多小游戲也因此蓬勃發(fā)展。這篇文章受眾之大,后來被人重新整理并發(fā)布為,其中還包括中文版。 showImg(https://segmentfault.com/img/bVbjM5r?w=1142&h=640); 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 這...
摘要:,美國著名程序員風(fēng)險(xiǎn)投資家博客和技術(shù)作家。,從年以來,獲獎的計(jì)算機(jī)科學(xué)方面的論文收集。截至年月,已收集超過萬篇預(yù)印本。其中的分類可以認(rèn)為也是一個(gè)論文的集散地。 showImg(https://segmentfault.com/img/bVbjVFa?w=1142&h=640); 這個(gè)是我訂閱 陳皓老師在極客上的專欄《左耳聽風(fēng)》,我整理出來是為了自己方便學(xué)習(xí),同時(shí)也分享給你們一起學(xué)習(xí),當(dāng)...
摘要:,谷歌給的一份性能指南和最佳實(shí)踐。目前而言,前端社區(qū)有三大框架和。隨后重點(diǎn)講述了和兩大前端框架,給出了大量的文章教程和相關(guān)資源列表。我認(rèn)為,使用函數(shù)式編程方式,更加符合后端程序員的思路,而是更符合前端工程師習(xí)慣的框架。 showImg(https://segmentfault.com/img/bVbjQAM?w=1142&h=640); 這個(gè)是我訂閱 陳皓老師在極客上的專欄《左耳聽風(fēng)》...
閱讀 1540·2023-04-26 00:20
閱讀 1130·2023-04-25 21:49
閱讀 808·2021-09-22 15:52
閱讀 583·2021-09-07 10:16
閱讀 976·2021-08-18 10:22
閱讀 2671·2019-08-30 14:07
閱讀 2243·2019-08-30 14:00
閱讀 2658·2019-08-30 13:00