反匯編程序
- java生成字節(jié)碼層面會(huì)隱藏實(shí)現(xiàn)細(xì)節(jié),通過(guò)匯編代碼了解程序運(yùn)行指令,這個(gè)介紹HSDIS(Hotspot Disassembler)和JITWatch的使用方式
- 注意:網(wǎng)上關(guān)于使用文章很多,以下方法是本人親測(cè)可用方法!
HSDIS使用
- 該插件是由Sun官方推薦的HotSpot虛擬機(jī)JIT編譯代碼的反匯編插件,實(shí)際上就是一個(gè)動(dòng)態(tài)庫(kù);
- 下載hsdis地址:hsdis-amd64.dylib,downLoad下載完畢放到JDK安裝路徑bin/文件下即可
- 使用IDE運(yùn)行程序時(shí)配置VM參數(shù)如下:
-Xcomp : 讓JVM以編譯模式執(zhí)行代碼,即JVM會(huì)在第一次運(yùn)行時(shí)即將所有字節(jié)碼編譯為本地代碼 -XX:+UnlockDiagnosticVMOptions : 解鎖診斷功能 -XX:+PrintAssembly : 輸出反匯編后的匯編指令 - 配置完成運(yùn)行程序即可
public class VolatileDemo { private static volatile int i = 0; public static void n(){ i++; } public static synchronized void m(){} public static void main(String[] args) { //熱點(diǎn)代碼,編譯成本地代碼 for (int j = 0; j < 1_000_000; j++) { n(); m(); } } } //如上代碼運(yùn)行即可在run中輸出匯編碼,搜索‘n'即可查看到該條匯編語(yǔ)句,這就是valotile關(guān)鍵字的匯編碼實(shí)現(xiàn)方式 lock addl $0x0,(%rsp) ;*putstatic i
JITWatch使用
- 上方中HSDIS打印查看方式很不方便,這里有三方插件解決此痛點(diǎn): 開(kāi)源地址
- 根據(jù)文檔下載源碼到本地,通過(guò)三種方式運(yùn)行:需要添加對(duì)應(yīng)的環(huán)境變量
//ant編譯 ant clean compile test run //maven編譯 mvn clean compile test exec:java //gradle編譯 ./gradlew clean build run - 使用任一方式運(yùn)行即可打開(kāi)JITWatch
- 配置config,Source locations選項(xiàng)Add Folder工程的java目錄
- Class locations為功能的classes目錄
- 配置vm調(diào)試
-XX:+LogCompilation JIT的編譯日志輸出 -XX:LogFile=jit.log日志重定向到日志文件 //前提設(shè)置 -XX:+UnlockDiagnosticVMOptions 解鎖診斷功能- 按照以上配置完畢運(yùn)行程序獲取log日志后添加到JITWatch的openLog中
-
點(diǎn)擊start運(yùn)行即可獲取源碼,字節(jié)碼,匯編代碼對(duì)比圖
image
