Java程式碼如何檢視位元組碼及彙編碼
我們知道一個Java類要想被Java虛擬機器載入,必須先生成相應的二進位制檔案,即class檔案,而一個方法或一段程式碼在執行期要麼被解釋執行,要麼被編譯器編譯成彙編碼,編譯執行,那如何去檢視這些轉換後的程式碼呢?
命令 javap
javap -v/-c F.class
javap 可以用命令擴充在ide工具裡,如:
eclipse Run/External Tools 然後點選要檢視的檔案,Run/External Tools/javap
解釋下配置項Name: 命名,如javap
Location: jdk中javap命令的絕對路徑
Working Directory:
工作目錄,可以在Variables裡選擇,
${project_loc} 表示當前所選擇的resource所在的project或正構建的project或所選擇的的絕對路徑
如果當前project已經加入到eclipse的workspace中,也可用 ${workspace_loc}/${project_name}
Arguments:
當前執行檔案相對於Working Directory的路徑
-classpath target/classes: classpath路徑
-v: Javap命令的
${java_type_name}:即當前Java檔案對於的class檔案,Variables裡選擇
eclipse擴充Javap命令 也可以在idea File/Settings/Tools/External Tools中配置:
idea擴充Javap命令 配置完後,右鍵需要檢視的檔案,選擇External Tools/javap -v
檢視彙編碼
首先要下載hsdis-amd64.dll檔案,並將檔案放置在%JAVA_HOME%/jre/bin的server和client目錄下
放置完後,可以 命令測試 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version
如果輸出PrintAssembly is enabled,說明hsdis-amd64安裝成功
hsdis-amd64安裝 注:有些jdk版本沒有client目錄
然後配置VM
-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*Test.add
idea中檢視彙編碼 解釋下配置項:
java -version -server -Xcomp
虛擬機器一般有兩種模式執行執行程式碼,即解釋模式和編譯模式,預設採用直譯器與其中一個編譯器直接配合的方式工作:混合模式,可以看到Java -version 輸出內容有mixed mode
使用引數“-Xint”強制虛擬機器執行於“解釋模式”(Interpreted Mode)
使用引數“-Xcomp”強制虛擬機器執行於“編譯模式”(CompiledMode)
而HotSpot虛擬機器中內建了兩個即時編譯器
C1 ClientCompiler
C2 Server Compiler
從Java -version 輸出 Java HotSpot(TM) 64-Bit Server VM可以得知,執行於Server模式
-XX:+UnlockDiagnosticVMOptions
開啟虛擬機器的診斷模式,一些引數(如PrintAssembly)在診斷模式下才能使用
-XX:+PrintAssembly
列印即時編譯後的二進位制資訊,即彙編碼
-XX:CompileCommand=compileonly,*Test.add
編譯時接受的指令,這裡compileonly,*Test.add 是指編譯add方法
全能檢視,即可檢視程式碼,同時也可以對照位元組碼和彙編碼
在GitHub中下載jitwatch,點選其目錄下的launchUI,開啟圖形視窗,
config中配置Java檔案所在的專案路徑及classpath路徑
jitwatch Config配置 idea VM 引數
-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*Test.add -XX:+LogCompilation -XX:LogFile=jit1.log
執行後會在classpath下生成jit1.log日誌檔案,點選jitwatch視窗的Open Log匯入日誌檔案,再Staart執行,可以檢視執行的Source,Bytecode,Assembiy
相關文章
- JVM 模板直譯器之如何根據位元組碼生成彙編碼?JVM
- Java 位元組碼Java
- 編碼、摘要和加密(一)——位元組編碼加密
- JWebAssembly:Java 位元組碼到 WebAssembly 編譯器WebJava編譯
- 位元組跳動視訊編解碼面經
- JAVA動態位元組碼Java
- 【Java】JVM位元組碼分析JavaJVM
- 彙編程式碼Helloworld
- pyc位元組碼文字轉python程式碼Python
- java 程式碼編譯檢查工具Java編譯
- python反編譯之位元組碼Python編譯
- 輕鬆看懂Java位元組碼Java
- Java位元組碼指令表Java
- Java類轉位元組碼工具Java
- 位元組碼
- Pycharm 如何檢視程式碼修改歷史|回滾程式碼PyCharm
- 例項分析理解Java位元組碼Java
- Java位元組碼增強技術Java
- [20231012]如何檢視unicode編碼內容.txtUnicode
- [20210422]如何檢視字元的ascii編碼.txt字元ASCII
- CatFly【彙編程式碼還原】
- 位元組碼指令
- 位元組碼引用檢測原理與實戰
- Java 動態性(4) – 位元組碼操作Java
- 從 Java 位元組碼到 ASM 實踐JavaASM
- 學習 Java 之 位元組碼驗證Java
- Dalvik 和 Java 位元組碼的比較Java
- 什麼是位元組碼?python位元組碼詳細介紹!Python
- 位元組碼基礎
- 位元組碼詳解
- 如何學習用Java編寫程式碼?Java
- PyCon 2018: 中文視訊(1):理解位元組碼
- 如何檢視python原始碼Python原始碼
- JVM(四):深入分析Java位元組碼-下JVMJava
- JVM(三):深入分析Java位元組碼-上JVMJava
- 推薦一款IDEA神器!一鍵檢視Java位元組碼以及其他類資訊IdeaJava
- 開啟java語言世界通往位元組碼世界的大門——ASM位元組碼操作類庫JavaASM
- ASM位元組碼操作類庫:開啟java語言世界通往位元組碼世界的大門ASMJava