JVM常用指令

2021-10-10 16:25:20 字數 1972 閱讀 7562

1)指令集的分類

指令集大體上可分為兩類:基於棧的指令集、基於暫存器的指令集。基於棧的指令集是利用出棧和進棧來實現的,基於暫存器的指令集是通過暫存器的特性來實現的,基於暫存器的指令集複雜但是高效。

2)基於棧的指令集

大多數指令並不包含運算元,只有乙個操作碼,指令引數都存放於運算元棧中,操作碼的長度為乙個位元組(即0-255),所以指令集的操作碼總數不會超過256條。

3)樣例介紹

【樣例程式1】

程式**、程式對應生成的位元組碼檔案、區域性變數表內容如下所示

因為這裡的方法不是靜態方法,所以在區域性變數中的首位是this,其次是區域性變數a、b和c。其中位元組碼檔案的程式執行順序是:執行iload_1和iload_2指令將區域性變數中的第1號位置資料a和第2號索引資料b的資料壓入棧,iadd將棧中的兩個元素彈出並相加得到c,然後壓入棧,彈出棧中資料c並儲存在區域性變數表的3號位置,返回。

【樣例程式2】

根據下面三個例子,以最複雜的第三個為例介紹:紅色框表示執行第一句話,其中new#2表示建立乙個新的物件,物件放在棧中的2號索引處,物件的類為後面<>裡面的內容。dup指令表示複製乙份棧中的物件。invokespecial表示使用該複製份物件完成初始化載入,載入完成之後將該複製份彈出棧。橘色框表示執行第二句**,aload1表示載入區域性變數表中索引1位置的資料h,invokevirtrual#4表示執行棧中第4索引位置對應的方法,istore2表示將棧中的結果儲存到區域性變數表的2號索引位置,結束。

【樣例程式3】

遞迴方法的程式以及位元組碼檔案如下所示,其中if_icmpne 7指令表示從棧中彈出兩條指令並比較,如果不等則執行後面的第7條執行,如果相等則繼續往下執行。

1)常用的指令如下所示:

指令 釋義

iconst_1 int型常量值1進棧

bipush 將乙個byte型常量值推送至棧頂

iload_1 第二位置的乙個int型區域性變數進棧,從0開始計數

istore_1 將棧頂int型數值存入第二位置,從0開始計數

iadd 棧頂兩int型數值相加,並且結果進棧

return 當前方法返回void

getstatic 獲取指定類的靜態域,並將其值壓入棧頂

putstatic 為指定類的靜態域賦值

invokevirtual 呼叫例項方法,支援多型

invokespecial 可以直接呼叫的方法,不需要多型

例如,呼叫超類構造方法、例項初始化方法、私有方法

invokestatic 呼叫靜態方法

invokeinte***ce 呼叫介面方法

invokedynamic lambda表示式或者反射或者其他動態語言scala kotlin,或者cglib asm,動態產生的class,會用到的指令

new 建立乙個物件,並且其引用進棧

newarray 建立乙個基本型別陣列,並且其引用進棧

2)特殊的指令

因為指令條數有限(最大為256條),不可能支援所有的資料型別,大部分指令沒有支援byte、char、short、boolean型別,在編譯器或者執行期時將這些型別轉為int型別資料,然後通過int型別的相關指令去操作。

jvm 監控指令 jstack

格式 jstack option vmid 選項 l 除了堆疊資訊外,顯示關於鎖的附加資訊。作用 生成虛擬機器當前時刻的執行緒快照。目的 定位執行緒長時間停頓的原因,比如執行緒間死鎖 死迴圈 請求外部資源導致的長時間等待。使用步驟 1.得到執行緒快照。sudo u tomcat jstack l 程...

jvm 監控指令 jstack

格式 jstack option vmid 選項 l 除了堆疊資訊外,顯示關於鎖的附加資訊。作用 生成虛擬機器當前時刻的執行緒快照。目的 定位執行緒長時間停頓的原因,比如執行緒間死鎖 死迴圈 請求外部資源導致的長時間等待。使用步驟 1.得到執行緒快照。sudo u tomcat jstack l 程...

jvm 監控指令 jstack

格式 jstack option vmid 選項 l 除了堆疊資訊外,顯示關於鎖的附加資訊。作用 生成虛擬機器當前時刻的執行緒快照。目的 定位執行緒長時間停頓的原因,比如執行緒間死鎖 死迴圈 請求外部資源導致的長時間等待。使用步驟 1.得到執行緒快照。sudo u tomcat jstack l 程...