天天看點

JVM性能深度調優 之 JVM javap工具相關學習路線

文章目錄

    • javap
      • 用法
      • 作用
      • JVM指令手冊
  • 相關學習路線

javap

用法

用法: javap < options > < classes >

其中, 可能的選項包括:

-help --help -? 輸出此用法消息

-version 版本資訊

-v -verbose 輸出附加資訊

-l 輸出行号和本地變量表

-public 僅顯示公共類和成員

-protected 顯示受保護的/公共類和成員

-package 顯示程式包/受保護的/公共類和成員 (預設)

-p -private 顯示所有類和成員

-c 對代碼進行反彙編

-s 輸出内部類型簽名

-sysinfo 顯示正在處理的類的 系統資訊 (路徑, 大小, 日期, MD5 散列)

-constants 顯示最終常量

-classpath

指定查找使用者類檔案的位置

-cp

指定查找使用者類檔案的位置

-bootclasspath

覆寫引導類檔案的位置

作用

主要用于反彙編位元組碼檔案。

JVM指令手冊

棧和局部變量操作  
将常量壓入棧的指令  
aconst_null 将null對象引用壓入棧  
iconst_m1 将int類型常量-1壓入棧  
iconst_0 将int類型常量0壓入棧  
iconst_1 将int類型常量1壓入棧  
iconst_2 将int類型常量2壓入棧  
iconst_3 将int類型常量3壓入棧  
iconst_4 将int類型常量4壓入棧  
iconst_5 将int類型常量5壓入棧  
lconst_0 将long類型常量0壓入棧  
lconst_1 将long類型常量1壓入棧  
fconst_0 将float類型常量0壓入棧  
fconst_1 将float類型常量1壓入棧  
dconst_0 将double類型常量0壓入棧  
dconst_1 将double類型常量1壓入棧  
bipush 将一個8位帶符号整數壓入棧  
sipush 将16位帶符号整數壓入棧  
ldc 把常量池中的項壓入棧  
ldc_w 把常量池中的項壓入棧(使用寬索引)  
ldc2_w 把常量池中long類型或者double類型的項壓入棧(使用寬索引)  

從棧中的局部變量中裝載值的指令  
iload 從局部變量中裝載int類型值  
lload 從局部變量中裝載long類型值  
fload 從局部變量中裝載float類型值  
dload 從局部變量中裝載double類型值  
aload 從局部變量中裝載引用類型值(refernce)  
iload_0 從局部變量0中裝載int類型值  
iload_1 從局部變量1中裝載int類型值  
iload_2 從局部變量2中裝載int類型值  
iload_3 從局部變量3中裝載int類型值  
lload_0 從局部變量0中裝載long類型值  
lload_1 從局部變量1中裝載long類型值  
lload_2 從局部變量2中裝載long類型值  
lload_3 從局部變量3中裝載long類型值  
fload_0 從局部變量0中裝載float類型值  
fload_1 從局部變量1中裝載float類型值 
fload_2 從局部變量2中裝載float類型值  
fload_3 從局部變量3中裝載float類型值  
dload_0 從局部變量0中裝載double類型值  
dload_1 從局部變量1中裝載double類型值  
dload_2 從局部變量2中裝載double類型值  
dload_3 從局部變量3中裝載double類型值  
aload_0 從局部變量0中裝載引用類型值  
aload_1 從局部變量1中裝載引用類型值  
aload_2 從局部變量2中裝載引用類型值  
aload_3 從局部變量3中裝載引用類型值  
iaload 從數組中裝載int類型值  
laload 從數組中裝載long類型值  
faload 從數組中裝載float類型值  
daload 從數組中裝載double類型值  
aaload 從數組中裝載引用類型值  
baload 從數組中裝載byte類型或boolean類型值  
caload 從數組中裝載char類型值  
saload 從數組中裝載short類型值  

将棧中的值存入局部變量的指令  
istore 将int類型值存入局部變量  
lstore 将long類型值存入局部變量  
fstore 将float類型值存入局部變量  
dstore 将double類型值存入局部變量  
astore 将将引用類型或returnAddress類型值存入局部變量  
istore_0 将int類型值存入局部變量0  
istore_1 将int類型值存入局部變量1  
istore_2 将int類型值存入局部變量2  
istore_3 将int類型值存入局部變量3  
lstore_0 将long類型值存入局部變量0  
lstore_1 将long類型值存入局部變量1  
lstore_2 将long類型值存入局部變量2  
lstore_3 将long類型值存入局部變量3  
fstore_0 将float類型值存入局部變量0  
fstore_1 将float類型值存入局部變量1  
fstore_2 将float類型值存入局部變量2  
fstore_3 将float類型值存入局部變量3  
dstore_0 将double類型值存入局部變量0  
dstore_1 将double類型值存入局部變量1 
dstore_2 将double類型值存入局部變量2  
dstore_3 将double類型值存入局部變量3  
astore_0 将引用類型或returnAddress類型值存入局部變量0  
astore_1 将引用類型或returnAddress類型值存入局部變量1  
astore_2 将引用類型或returnAddress類型值存入局部變量2  
astore_3 将引用類型或returnAddress類型值存入局部變量3  
iastore 将int類型值存入數組中  
lastore 将long類型值存入數組中  
fastore 将float類型值存入數組中  
dastore 将double類型值存入數組中  
aastore 将引用類型值存入數組中  
bastore 将byte類型或者boolean類型值存入數組中  
castore 将char類型值存入數組中  
sastore 将short類型值存入數組中  

wide指令  
wide 使用附加位元組擴充局部變量索引  

通用(無類型)棧操作  
nop 不做任何操作  
pop 彈出棧頂端一個字長的内容  
pop2 彈出棧頂端兩個字長的内容  
dup 複制棧頂部一個字長内容  
dup_x1 複制棧頂部一個字長的内容,然後将複制内容及原來彈出的兩個字長的内容壓入 棧 
dup_x2 複制棧頂部一個字長的内容,然後将複制内容及原來彈出的三個字長的内容壓入 棧  
dup2 複制棧頂部兩個字長内容  
dup2_x1 複制棧頂部兩個字長的内容,然後将複制内容及原來彈出的三個字長的内容壓入 棧  
dup2_x2 複制棧頂部兩個字長的内容,然後将複制内容及原來彈出的四個字長的内容壓入 棧  swap 交換棧頂部兩個字長内容  類型轉換  
i2l 把int類型的資料轉化為long類型  
i2f 把int類型的資料轉化為float類型  
i2d 把int類型的資料轉化為double類型  
l2i 把long類型的資料轉化為int類型  
l2f 把long類型的資料轉化為float類型  
l2d 把long類型的資料轉化為double類型 
f2i 把float類型的資料轉化為int類型  
f2l 把float類型的資料轉化為long類型  
f2d 把float類型的資料轉化為double類型  
d2i 把double類型的資料轉化為int類型  
d2l 把double類型的資料轉化為long類型  
d2f 把double類型的資料轉化為float類型  
i2b 把int類型的資料轉化為byte類型  
i2c 把int類型的資料轉化為char類型  
i2s 把int類型的資料轉化為short類型  

整數運算  
iadd 執行int類型的加法  
ladd 執行long類型的加法  
isub 執行int類型的減法  
lsub 執行long類型的減法  
imul 執行int類型的乘法  
lmul 執行long類型的乘法  
idiv 執行int類型的除法  
ldiv 執行long類型的除法  

irem 計算int類型除法的餘數  
lrem 計算long類型除法的餘數  
ineg 對一個int類型值進行取反操作  
lneg 對一個long類型值進行取反操作  
iinc 把一個常量值加到一個int類型的局部變量上  

邏輯運算  
移位操作  
ishl 執行int類型的向左移位操作  
lshl 執行long類型的向左移位操作  
ishr 執行int類型的向右移位操作  
lshr 執行long類型的向右移位操作  
iushr 執行int類型的向右邏輯移位操作  
lushr 執行long類型的向右邏輯移位操作  

按位布爾運算  
iand 對int類型值進行“邏輯與”操作  
land 對long類型值進行“邏輯與”操作  
ior 對int類型值進行“邏輯或”操作  
lor 對long類型值進行“邏輯或”操作  
ixor 對int類型值進行“邏輯異或”操作  
lxor 對long類型值進行“邏輯異或”操作 

浮點運算  
fadd 執行float類型的加法  
dadd 執行double類型的加法  
fsub 執行float類型的減法  
dsub 執行double類型的減法  
fmul 執行float類型的乘法  
dmul 執行double類型的乘法  
fdiv 執行float類型的除法  
ddiv 執行double類型的除法  
frem 計算float類型除法的餘數  
drem 計算double類型除法的餘數  
fneg 将一個float類型的數值取反  
dneg 将一個double類型的數值取反  

對象和數組  
對象操作指令  
new 建立一個新對象  
checkcast 确定對象為所給定的類型  
getfield 從對象中擷取字段  
putfield 設定對象中字段的值  
getstatic 從類中擷取靜态字段  
putstatic 設定類中靜态字段的值  
instanceof 判斷對象是否為給定的類型  數組操作指令  
newarray 配置設定資料成員類型為基本上資料類型的新數組  
anewarray 配置設定資料成員類型為引用類型的新數組  
arraylength 擷取數組長度  
multianewarray 配置設定新的多元數組  

控制流  
條件分支指令  
ifeq 如果等于0,則跳轉  
ifne 如果不等于0,則跳轉  
iflt 如果小于0,則跳轉  
ifge 如果大于等于0,則跳轉  
ifgt 如果大于0,則跳轉  
ifle 如果小于等于0,則跳轉  
if_icmpcq 如果兩個int值相等,則跳轉  
if_icmpne 如果兩個int類型值不相等,則跳轉  
if_icmplt 如果一個int類型值小于另外一個int類型值,則跳轉 
if_icmpge 如果一個int類型值大于或者等于另外一個int類型值,則跳轉  
if_icmpgt 如果一個int類型值大于另外一個int類型值,則跳轉  
if_icmple 如果一個int類型值小于或者等于另外一個int類型值,則跳轉  
ifnull 如果等于null,則跳轉  ifnonnull 如果不等于null,則跳轉  
if_acmpeq 如果兩個對象引用相等,則跳轉  if_acmpnc 如果兩個對象引用不相等,則跳轉  

比較指令  
lcmp 比較long類型值  
fcmpl 比較float類型值(當遇到NaN時,傳回-1)  
fcmpg 比較float類型值(當遇到NaN時,傳回1)  
dcmpl 比較double類型值(當遇到NaN時,傳回-1)  
dcmpg 比較double類型值(當遇到NaN時,傳回1)  

無條件轉移指令  
goto 無條件跳轉  
goto_w 無條件跳轉(寬索引)  

表跳轉指令  
tableswitch 通過索引通路跳轉表,并跳轉  
lookupswitch 通過鍵值比對通路跳轉表,并執行跳轉操作  

異常  
athrow 抛出異常或錯誤  
finally子句  
jsr 跳轉到子例程  
jsr_w 跳轉到子例程(寬索引)  
rct 從子例程傳回  

方法調用與傳回  
方法調用指令  
invokcvirtual 運作時按照對象的類來調用執行個體方法  
invokespecial 根據編譯時類型來調用執行個體方法  
invokestatic 調用類(靜态)方法  
invokcinterface 調用接口方法  

方法傳回指令  
ireturn 從方法中傳回int類型的資料  
lreturn 從方法中傳回long類型的資料  
freturn 從方法中傳回float類型的資料  
dreturn 從方法中傳回double類型的資料  
areturn 從方法中傳回引用類型的資料  
return 從方法中傳回,傳回值為void 

線程同步  
montiorenter 進入并擷取對象螢幕  
monitorexit 釋放并退出對象螢幕 

JVM指令助記符  
變量到操作數棧:iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_  
操作數棧到變量: istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstor_,astore,astore_  
常數到操作數棧: bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_,lconst_,fconst_,dconst_  
加:iadd,ladd,fadd,dadd  
減:isub,lsub,fsub,dsub  
乘:imul,lmul,fmul,dmul  
除:idiv,ldiv,fdiv,ddiv  
餘數:irem,lrem,frem,drem  
取負:ineg,lneg,fneg,dneg  
移位:ishl,lshr,iushr,lshl,lshr,lushr  
按位或:ior,lor  按位與:iand,land  
按位異或:ixor,lxor  
類型轉換:i2l,i2f,i2d,l2f,l2d,f2d(放寬數值轉換)  i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(縮窄數值轉換)  
建立類實便:new  
建立新數組:newarray,anewarray,multianwarray  
通路類的域和類執行個體域:getfield,putfield,getstatic,putstatic  
把資料裝載到操作數棧:baload,caload,saload,iaload,laload,faload,daload,aaload  
從操作數棧存存儲到數組: bastore,castore,sastore,iastore,lastore,fastore,dastore,aastore  
擷取數組長度:arraylength  檢相類執行個體或數組屬性:instanceof,checkcast  
操作數棧管理:pop,pop2,dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap  
有條件轉移:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene,  if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmpl  fcmpg,dcmpl,dcmpg  
複合條件轉移:tableswitch,lookupswitch  
無條件轉移:goto,goto_w,jsr,jsr_w,ret  
排程對象的實便方法:invokevirtual  
調用由接口實作的方法:invokeinterface  
調用需要特殊處理的執行個體方法:invokespecial 
調用命名類中的靜态方法:invokestatic  
方法傳回:ireturn,lreturn,freturn,dreturn,areturn,return  
異常:athrow  finally關鍵字的實作使用:jsr,jsr_w,ret
           

相關學習路線

JAVA資深架構師成長路線->架構師築基必備技能->JVM性能深度調優