文章目錄
-
- 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性能深度調優