python字节码解析_从底层入手,解析字节码增强和Btrace应用
這篇文章聊下字節碼和相關的應用。
1、機器碼和字節碼
機器碼(machine code),學名機器語言指令,有時也被稱為原生碼(Native Code),是電腦的CPU可直接解讀的數據。
通常意義上來理解的話,機器碼就是計算機可以直接執行,并且執行速度最快的代碼。
用機器語言編寫程序,編程人員要首先熟記所用計算機的全部指令代碼和代碼的涵義。手編程序時,程序員得自己處理每條指令和每一數據的存儲分配和輸入輸出,還得記住編程過程中每步所使用的工作單元處在何種狀態。這是一件十分繁瑣的工作,編寫程序花費的時間往往是實際運行時間的幾十倍或幾百倍。而且,編出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。
字節碼(Bytecode)是一種包含執行程序、由一序列 op 代碼/數據對 組成的二進制文件。字節碼是一種中間碼,它比機器碼更抽象,需要直譯器轉譯后才能成為機器碼的中間代碼。
通常情況下它是已經經過編譯,但與特定機器碼無關。字節碼通常不像源碼一樣可以讓人閱讀,而是編碼后的數值常量、引用、指令等構成的序列。
字節碼主要為了實現特定軟件運行和軟件環境、與硬件環境無關。字節碼的實現方式是通過編譯器和虛擬機器。編譯器將源碼編譯成字節碼,特定平臺上的虛擬機器將字節碼轉譯為可以直接執行的指令。
字節碼的典型應用為Java bytecode。字節碼在運行時通過JVM(JAVA虛擬機)做一次轉換生成機器指令,因此能夠更好的跨平臺運行。
2、字節碼增強技術
Java字節碼增強指的是在Java字節碼生成之后,對其進行修改,增強其功能,這種方式相當于對應用程序的二進制文件進行修改。Java字節碼增強主要是為了減少冗余代碼,提高性能等。
實現字節碼增強的主要步驟為:
(1)修改字節碼
在內存中獲取到原來的字節碼,然后通過一些工具(如 ASM,Javaasist)來修改它的byte[]數組,得到一個新的byte數組。
(2)使修改后的字節碼生效
有兩種方法:
- 自定義ClassLoader來加載修改后的字節碼;
- 替換掉原來的字節碼:在JVM加載用戶的Class時,攔截,返回修改后的字節碼;或者在運行時,使用Instrumentation.redefineClasses方法來替換掉原來的字節碼;
3、字節碼增強有哪些實現
字節碼增強技術有以下這些:
- 動態代理
- CGLIB
- Javassist
- asm
以 ASM 為例, 使用它可以動態修改類、方法,甚至可以重新定義類,連 CGLib 底層都是用 ASM 實現的。
4、Btrace原理和應用
BTrace是SUN Kenai云計算開發平臺下的一個開源項目,旨在為java提供安全可靠的動態跟蹤分析工具。
那么,BTrace這么神奇的功能是如何實現的呢?既然這是個開源的代碼,那么直接從代碼找原理。BTrace代碼開源在https://github.com/btraceio/btrace。
BTrace是基于動態字節碼修改技術(Hotswap)來實現運行時java程序的跟蹤和替換。大體的原理可以用下面的公式描述:
Client(Java compile api + attach api) + Agent(腳本解析引擎 + ASM + JDK6 Instumentation) + SocketBTrace工作時序圖如下:
BTrace就是使用ASM修改當前類,附加調試信息,得到新的類,一般情況下,Class文件是通過javac編譯器產生的,然后通過類加載器加載到虛擬機內,再通過執行引擎去執行?,F在可以通過ASM的API直接生成符合Java虛擬機規范的Class字節流,這樣,ASM做的事情一定程度上正是javac解釋器做的工作。
5、總結
字節碼增強技術可以動態地對運行中的程序做修改,也可以跟蹤JVM運行中程序的狀態。此外,我們平時使用的動態代理、AOP也與字節碼增強密切相關,它們實質上還是利用各種手段生成符合規范的字節碼文件。
掌握字節碼增強后可以高效地定位并快速修復一些棘手的問題(如線上性能問題、方法出現不可控的出入參需要緊急加日志等問題),也可以在開發中減少冗余代碼,大大提高開發效率。
關注公眾號:架構進化論,獲得第一手的技術資訊和原創文章總結
以上是生活随笔為你收集整理的python字节码解析_从底层入手,解析字节码增强和Btrace应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 保存本地乱码_请教大神,如
- 下一篇: websocket python爬虫_p