這篇文章聊下字節碼和相關的應用。java
機器碼(machine code),學名機器語言指令,有時也被稱爲原生碼(Native Code),是電腦的CPU可直接解讀的數據。git
一般意義上來理解的話,機器碼就是計算機能夠直接執行,而且執行速度最快的代碼。程序員
用機器語言編寫程序,編程人員要首先熟記所用計算機的所有指令代碼和代碼的涵義。手編程序時,程序員得本身處理每條指令和每一數據的存儲分配和輸入輸出,還得記住編程過程當中每步所使用的工做單元處在何種狀態。這是一件十分繁瑣的工做,編寫程序花費的時間每每是實際運行時間的幾十倍或幾百倍。並且,編出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。github
字節碼(Bytecode)是一種包含執行程序、由一序列 op 代碼/數據對 組成的二進制文件。字節碼是一種中間碼,它比機器碼更抽象,須要直譯器轉譯後才能成爲機器碼的中間代碼。編程
一般狀況下它是已經通過編譯,但與特定機器碼無關。字節碼一般不像源碼同樣可讓人閱讀,而是編碼後的數值常量、引用、指令等構成的序列。api
字節碼主要爲了實現特定軟件運行和軟件環境、與硬件環境無關。字節碼的實現方式是經過編譯器和虛擬機器。編譯器將源碼編譯成字節碼,特定平臺上的虛擬機器將字節碼轉譯爲能夠直接執行的指令。數組
字節碼的典型應用爲Java bytecode。字節碼在運行時經過JVM(JAVA虛擬機)作一次轉換生成機器指令,所以可以更好的跨平臺運行。安全
Java字節碼加強指的是在Java字節碼生成以後,對其進行修改,加強其功能,這種方式至關於對應用程序的二進制文件進行修改。Java字節碼加強主要是爲了減小冗餘代碼,提升性能等。工具
實現字節碼加強的主要步驟爲:性能
在內存中獲取到原來的字節碼,而後經過一些工具(如 ASM,Javaasist)來修改它的byte[]數組,獲得一個新的byte數組。
有兩種方法:
字節碼加強技術有如下這些:
以 ASM 爲例, 使用它能夠動態修改類、方法,甚至能夠從新定義類,連 CGLib 底層都是用 ASM 實現的。
BTrace是SUN Kenai雲計算開發平臺下的一個開源項目,旨在爲java提供安全可靠的動態跟蹤分析工具。
那麼,BTrace這麼神奇的功能是如何實現的呢?既然這是個開源的代碼,那麼直接從代碼找原理。BTrace代碼開源在https://github.com/btraceio/btrace。
BTrace是基於動態字節碼修改技術(Hotswap)來實現運行時java程序的跟蹤和替換。大致的原理能夠用下面的公式描述:
Client(Java compile api + attach api) + Agent(腳本解析引擎 + ASM + JDK6 Instumentation) + Socket
BTrace工做時序圖以下:
BTrace就是使用ASM修改當前類,附加調試信息,獲得新的類,通常狀況下,Class文件是經過javac編譯器產生的,而後經過類加載器加載到虛擬機內,再經過執行引擎去執行。如今能夠經過ASM的API直接生成符合Java虛擬機規範的Class字節流,這樣,ASM作的事情必定程度上正是javac解釋器作的工做。
字節碼加強技術能夠動態地對運行中的程序作修改,也能夠跟蹤JVM運行中程序的狀態。此外,咱們平時使用的動態代理、AOP也與字節碼加強密切相關,它們實質上仍是利用各類手段生成符合規範的字節碼文件。
掌握字節碼加強後能夠高效地定位並快速修復一些棘手的問題(如線上性能問題、方法出現不可控的出入參須要緊急加日誌等問題),也能夠在開發中減小冗餘代碼,大大提升開發效率。