首頁>技術>

我們知道一個Java檔案要想被Java虛擬機器載入,必須先生成相應的二進位制檔案,即class檔案,而一個方法或一段程式碼在執行期要麼被解釋執行,要麼被編譯器編譯成彙編碼,編譯執行,那如何去檢視這些轉換後的?

命令 javap

javap -v/-c F.class

javap

可以用命令拓展在ide工具裡,如:

eclipse Run/External Tools

解釋下配置項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命令的<options>

${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方法

全能檢視,即可檢視程式碼,同時也可以對照位元組碼和彙編碼

config中配置Java檔案所在的專案路徑及classpath路徑

jitwatch Config配置

idea VM 引數

-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*Test.add -XX:+LogCompilation -XX:LogFile=jit1.log

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Ubuntu安裝甜糖 - docker執行甜糖