1. 程式人生 > >JVM指令集整理

JVM指令集整理

看位元組碼從這裡開始。

指令碼 助記符 說明
0×00 nop 什麼都不做
0×01 aconst_null 將null推送至棧頂
0×02 iconst_m1 將int型-1推送至棧頂
0×03 iconst_0 將int型0推送至棧頂
0×04 iconst_1 將int型1推送至棧頂
0×05 iconst_2 將int型2推送至棧頂
0×06 iconst_3 將int型3推送至棧頂
0×07 iconst_4 將int型4推送至棧頂
0×08 iconst_5 將int型5推送至棧頂
0×09 lconst_0 將long型0推送至棧頂
0x0a lconst_1 將long型1推送至棧頂
0x0b fconst_0 將float型0推送至棧頂
0x0c fconst_1 將float型1推送至棧頂
0x0d fconst_2 將float型2推送至棧頂
0x0e dconst_0 將double型0推送至棧頂
0x0f dconst_1 將double型1推送至棧頂
0×10 bipush 將單位元組的常量值(-128~127)推送至棧頂
0×11 sipush 將一個短整型常量值(-32768~32767)推送至棧頂
0×12 ldc 將int, float或String型常量值從常量池中推送至棧頂
0×13 ldc_w 將int, float或String型常量值從常量池中推送至棧頂(寬索引)
0×14 ldc2_w 將long或double型常量值從常量池中推送至棧頂(寬索引)
0×15 iload 將指定的int型本地變數推送至棧頂
0×16 lload 將指定的long型本地變數推送至棧頂
0×17 fload 將指定的float型本地變數推送至棧頂
0×18 dload 將指定的double型本地變數推送至棧頂
0×19 aload 將指定的引用型別本地變數推送至棧頂
0x1a iload_0 將第0個int型本地變數推送至棧頂
0x1b iload_1 將第1個int型本地變數推送至棧頂
0x1c iload_2 將第2個int型本地變數推送至棧頂
0x1d iload_3 將第3個int型本地變數推送至棧頂
0x1e lload_0 將第0個long型本地變數推送至棧頂
0x1f lload_1 將第1個long型本地變數推送至棧頂
0×20 lload_2 將第2個long型本地變數推送至棧頂
0×21 lload_3 將第3個long型本地變數推送至棧頂
0×22 fload_0 將第0個float型本地變數推送至棧頂
0×23 fload_1 將第1個float型本地變數推送至棧頂
0×24 fload_2 將第2個float型本地變數推送至棧頂
0×25 fload_3 將第3個float型本地變數推送至棧頂
0×26 dload_0 將第0個double型本地變數推送至棧頂
0×27 dload_1 將第1個double型本地變數推送至棧頂
0×28 dload_2 將第2個double型本地變數推送至棧頂
0×29 dload_3 將第3個double型本地變數推送至棧頂
0x2a aload_0 將第0個引用型別本地變數推送至棧頂
0x2b aload_1 將第1個引用型別本地變數推送至棧頂
0x2c aload_2 將第2個引用型別本地變數推送至棧頂
0x2d aload_3 將第3個引用型別本地變數推送至棧頂
0x2e iaload 將int型陣列指定索引的值推送至棧頂
0x2f laload 將long型陣列指定索引的值推送至棧頂
0×30 faload 將float型陣列指定索引的值推送至棧頂
0×31 daload 將double型陣列指定索引的值推送至棧頂
0×32 aaload 將引用型陣列指定索引的值推送至棧頂
0×33 baload 將boolean或byte型陣列指定索引的值推送至棧頂
0×34 caload 將char型陣列指定索引的值推送至棧頂
0×35 saload 將short型陣列指定索引的值推送至棧頂
0×36 istore 將棧頂int型數值存入指定本地變數
0×37 lstore 將棧頂long型數值存入指定本地變數
0×38 fstore 將棧頂float型數值存入指定本地變數
0×39 dstore 將棧頂double型數值存入指定本地變數
0x3a astore 將棧頂引用型數值存入指定本地變數
0x3b istore_0 將棧頂int型數值存入第0個本地變數
0x3c istore_1 將棧頂int型數值存入第1個本地變數
0x3d istore_2 將棧頂int型數值存入第2個本地變數
0x3e istore_3 將棧頂int型數值存入第3個本地變數
0x3f lstore_0 將棧頂long型數值存入第0個本地變數
0×40 lstore_1 將棧頂long型數值存入第1個本地變數
0×41 lstore_2 將棧頂long型數值存入第2個本地變數
0×42 lstore_3 將棧頂long型數值存入第3個本地變數
0×43 fstore_0 將棧頂float型數值存入第0個本地變數
0×44 fstore_1 將棧頂float型數值存入第1個本地變數
0×45 fstore_2 將棧頂float型數值存入第2個本地變數
0×46 fstore_3 將棧頂float型數值存入第3個本地變數
0×47 dstore_0 將棧頂double型數值存入第0個本地變數
0×48 dstore_1 將棧頂double型數值存入第1個本地變數
0×49 dstore_2 將棧頂double型數值存入第2個本地變數
0x4a dstore_3 將棧頂double型數值存入第3個本地變數
0x4b astore_0 將棧頂引用型數值存入第0個本地變數
0x4c astore_1 將棧頂引用型數值存入第1個本地變數
0x4d astore_2 將棧頂引用型數值存入第2個本地變數
0x4e astore_3 將棧頂引用型數值存入第3個本地變數
0x4f iastore 將棧頂int型數值存入指定陣列的指定索引位置
0×50 lastore 將棧頂long型數值存入指定陣列的指定索引位置
0×51 fastore 將棧頂float型數值存入指定陣列的指定索引位置
0×52 dastore 將棧頂double型數值存入指定陣列的指定索引位置
0×53 aastore 將棧頂引用型數值存入指定陣列的指定索引位置
0×54 bastore 將棧頂boolean或byte型數值存入指定陣列的指定索引位置
0×55 castore 將棧頂char型數值存入指定陣列的指定索引位置
0×56 sastore 將棧頂short型數值存入指定陣列的指定索引位置
0×57 pop 將棧頂數值彈出 (數值不能是long或double型別的)
0×58 pop2 將棧頂的一個(long或double型別的)或兩個數值彈出(其它)
0×59 dup 複製棧頂數值並將複製值壓入棧頂
0x5a dup_x1 複製棧頂數值並將兩個複製值壓入棧頂
0x5b dup_x2 複製棧頂數值並將三個(或兩個)複製值壓入棧頂
0x5c dup2 複製棧頂一個(long或double型別的)或兩個(其它)數值並將複製值壓入棧頂
0x5d dup2_x1 <待補充>
0x5e dup2_x2 <待補充>
0x5f swap 將棧最頂端的兩個數值互換(數值不能是long或double型別的)
0×60 iadd 將棧頂兩int型數值相加並將結果壓入棧頂
0×61 ladd 將棧頂兩long型數值相加並將結果壓入棧頂
0×62 fadd 將棧頂兩float型數值相加並將結果壓入棧頂
0×63 dadd 將棧頂兩double型數值相加並將結果壓入棧頂
0×64 isub 將棧頂兩int型數值相減並將結果壓入棧頂
0×65 lsub 將棧頂兩long型數值相減並將結果壓入棧頂
0×66 fsub 將棧頂兩float型數值相減並將結果壓入棧頂
0×67 dsub 將棧頂兩double型數值相減並將結果壓入棧頂
0×68 imul 將棧頂兩int型數值相乘並將結果壓入棧頂
0×69 lmul 將棧頂兩long型數值相乘並將結果壓入棧頂
0x6a fmul 將棧頂兩float型數值相乘並將結果壓入棧頂
0x6b dmul 將棧頂兩double型數值相乘並將結果壓入棧頂
0x6c idiv 將棧頂兩int型數值相除並將結果壓入棧頂
0x6d ldiv 將棧頂兩long型數值相除並將結果壓入棧頂
0x6e fdiv 將棧頂兩float型數值相除並將結果壓入棧頂
0x6f ddiv 將棧頂兩double型數值相除並將結果壓入棧頂
0×70 irem 將棧頂兩int型數值作取模運算並將結果壓入棧頂
0×71 lrem 將棧頂兩long型數值作取模運算並將結果壓入棧頂
0×72 frem 將棧頂兩float型數值作取模運算並將結果壓入棧頂
0×73 drem 將棧頂兩double型數值作取模運算並將結果壓入棧頂
0×74 ineg 將棧頂int型數值取負並將結果壓入棧頂
0×75 lneg 將棧頂long型數值取負並將結果壓入棧頂
0×76 fneg 將棧頂float型數值取負並將結果壓入棧頂
0×77 dneg 將棧頂double型數值取負並將結果壓入棧頂
0×78 ishl 將int型數值左移位指定位數並將結果壓入棧頂
0×79 lshl 將long型數值左移位指定位數並將結果壓入棧頂
0x7a ishr 將int型數值右(符號)移位指定位數並將結果壓入棧頂
0x7b lshr 將long型數值右(符號)移位指定位數並將結果壓入棧頂
0x7c iushr 將int型數值右(無符號)移位指定位數並將結果壓入棧頂
0x7d lushr 將long型數值右(無符號)移位指定位數並將結果壓入棧頂
0x7e iand 將棧頂兩int型數值作“按位與”並將結果壓入棧頂
0x7f land 將棧頂兩long型數值作“按位與”並將結果壓入棧頂
0×80 ior 將棧頂兩int型數值作“按位或”並將結果壓入棧頂
0×81 lor 將棧頂兩long型數值作“按位或”並將結果壓入棧頂
0×82 ixor 將棧頂兩int型數值作“按位異或”並將結果壓入棧頂
0×83 lxor 將棧頂兩long型數值作“按位異或”並將結果壓入棧頂
0×84 iinc 將指定int型變數增加指定值,可以有兩個變數,分別表示index, const,index指第index個int型本地變數,const增加的值
0×85 i2l 將棧頂int型數值強制轉換成long型數值並將結果壓入棧頂
0×86 i2f 將棧頂int型數值強制轉換成float型數值並將結果壓入棧頂
0×87 i2d 將棧頂int型數值強制轉換成double型數值並將結果壓入棧頂
0×88 l2i 將棧頂long型數值強制轉換成int型數值並將結果壓入棧頂
0×89 l2f 將棧頂long型數值強制轉換成float型數值並將結果壓入棧頂
0x8a l2d 將棧頂long型數值強制轉換成double型數值並將結果壓入棧頂
0x8b f2i 將棧頂float型數值強制轉換成int型數值並將結果壓入棧頂
0x8c f2l 將棧頂float型數值強制轉換成long型數值並將結果壓入棧頂
0x8d f2d 將棧頂float型數值強制轉換成double型數值並將結果壓入棧頂
0x8e d2i 將棧頂double型數值強制轉換成int型數值並將結果壓入棧頂
0x8f d2l 將棧頂double型數值強制轉換成long型數值並將結果壓入棧頂
0×90 d2f 將棧頂double型數值強制轉換成float型數值並將結果壓入棧頂
0×91 i2b 將棧頂int型數值強制轉換成byte型數值並將結果壓入棧頂
0×92 i2c 將棧頂int型數值強制轉換成char型數值並將結果壓入棧頂
0×93 i2s 將棧頂int型數值強制轉換成short型數值並將結果壓入棧頂
0×94 lcmp 比較棧頂兩long型數值大小,並將結果(1,0,-1)壓入棧頂
0×95 fcmpl 比較棧頂兩float型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將-1壓入棧頂
0×96 fcmpg 比較棧頂兩float型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將1壓入棧頂
0×97 dcmpl 比較棧頂兩double型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將-1壓入棧頂
0×98 dcmpg 比較棧頂兩double型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將1壓入棧頂
0×99 ifeq 當棧頂int型數值等於0時跳轉
0x9a ifne 當棧頂int型數值不等於0時跳轉
0x9b iflt 當棧頂int型數值小於0時跳轉
0x9c ifge 當棧頂int型數值大於等於0時跳轉
0x9d ifgt 當棧頂int型數值大於0時跳轉
0x9e ifle 當棧頂int型數值小於等於0時跳轉
0x9f if_icmpeq 比較棧頂兩int型數值大小,當結果等於0時跳轉
0xa0 if_icmpne 比較棧頂兩int型數值大小,當結果不等於0時跳轉
0xa1 if_icmplt 比較棧頂兩int型數值大小,當結果小於0時跳轉
0xa2 if_icmpge 比較棧頂兩int型數值大小,當結果大於等於0時跳轉
0xa3 if_icmpgt 比較棧頂兩int型數值大小,當結果大於0時跳轉
0xa4 if_icmple 比較棧頂兩int型數值大小,當結果小於等於0時跳轉
0xa5 if_acmpeq 比較棧頂兩引用型數值,當結果相等時跳轉
0xa6 if_acmpne 比較棧頂兩引用型數值,當結果不相等時跳轉
0xa7 goto 無條件跳轉
0xa8 jsr 跳轉至指定16位offset位置,並將jsr下一條指令地址壓入棧頂
0xa9 ret 返回至本地變數指定的index的指令位置(一般與jsr, jsr_w聯合使用)
0xaa tableswitch 用於switch條件跳轉,case值連續(可變長度指令)
0xab lookupswitch 用於switch條件跳轉,case值不連續(可變長度指令)
0xac ireturn 從當前方法返回int
0xad lreturn 從當前方法返回long
0xae freturn 從當前方法返回float
0xaf dreturn 從當前方法返回double
0xb0 areturn 從當前方法返回物件引用
0xb1 return 從當前方法返回void
0xb2 getstatic 獲取指定類的靜態域,並將其值壓入棧頂
0xb3 putstatic 為指定的類的靜態域賦值
0xb4 getfield 獲取指定類的例項域,並將其值壓入棧頂
0xb5 putfield 為指定的類的例項域賦值
0xb6 invokevirtual 呼叫例項方法
0xb7 invokespecial 呼叫超類構造方法,例項初始化方法,私有方法
0xb8 invokestatic 呼叫靜態方法
0xb9 invokeinterface 呼叫介面方法
0xba
0xbb new 建立一個物件,並將其引用值壓入棧頂
0xbc newarray 建立一個指定原始型別(如int, float, char…)的陣列,並將其引用值壓入棧頂
0xbd anewarray 建立一個引用型(如類,介面,陣列)的陣列,並將其引用值壓入棧頂
0xbe arraylength 獲得陣列的長度值並壓入棧頂
0xbf athrow 將棧頂的異常丟擲
0xc0 checkcast 檢驗型別轉換,檢驗未通過將丟擲ClassCastException
0xc1 instanceof 檢驗物件是否是指定的類的例項,如果是將1壓入棧頂,否則將0壓入棧頂
0xc2 monitorenter 獲得物件的鎖,用於同步方法或同步塊
0xc3 monitorexit 釋放物件的鎖,用於同步方法或同步塊
0xc4 wide 當本地變數的索引超過255時使用該指令擴充套件索引寬度。
0xc5 multianewarray create a new array of dimensions dimensions with elements of type identified by class reference in constant pool index (indexbyte1 << 8 + indexbyte2); the sizes of each dimension is identified by count1, [count2, etc.]
0xc6 ifnull if value is null, branch to instruction at branchoffset (signed short constructed from unsigned bytes branchbyte1 << 8 + branchbyte2)
0xc7 ifnonnull if value is not null, branch to instruction at branchoffset (signed short constructed from unsigned bytes branchbyte1 << 8 + branchbyte2)
0xc8 goto_w goes to another instruction at branchoffset (signed int constructed from unsigned bytes branchbyte1 << 24 + branchbyte2 << 16 + branchbyte3 << 8 + branchbyte4)
0xc9 jsr_w jump to subroutine at branchoffset (signed int constructed from unsigned bytes branchbyte1 << 24 + branchbyte2 << 16 + branchbyte3 << 8 + branchbyte4) and place the return address on the stack
0xca breakpoint reserved for breakpoints in Java debuggers; should not appear in any class file
0xcb-0xfd 未命名 these values are currently unassigned for opcodes and are reserved for future use
0xfe impdep1 reserved for implementation-dependent operations within debuggers; should not appear in any class file
0xff impdep2 reserved for implementation-dependent operations within debuggers; should not appear in any class file

有了以上指令集表,那麼在檢視位元組碼就方便多了。

來幾個sample:

切換到檔案的對應的目錄

sample1

  • java

1

2

3

public void sample1(){

int num = 5;

}

  • javap -c 檢視位元組碼

1

2

3

4

5

public void sample1();

Code:

0: iconst_5

1: istore_1

2: return

  • 解釋

1

2

3

iconst_5 //將int型5推送至棧頂

istore_1 //將棧頂int型數值存入第1個本地變數

return //從當前方法返回void

sample2

  • java

1

2

3

public int sample2(int a, int b) {

return a + b;

}

  • 位元組碼及解釋

1

2

3

4

5

6

public int sample2(int, int);

Code:

0: iload_1 //將第1個int型本地變數推送至棧頂

1: iload_2 //將第2個int型本地變數推送至棧頂

2: iadd //將棧頂兩int型數值相加並將結果壓入棧頂

3: ireturn //從當前方法返回int

sample3

  • java

稍稍複雜點

1

2

3

4

5

6

7

public float sample3() {

float num = 0;

for (int i = 0; i < 5; i++) {

num *= i;

}

return num;

}

  • 位元組碼及解釋

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public float sample3();

Code:

0: fconst_0 //將float型0推送至棧頂

1: fstore_1 //將棧頂float型數值存入第1個本地變數

2: iconst_0 //將int型0推送至棧頂,也就是for迴圈中的i = 0

3: istore_2 //將棧頂int型數值存入第2個本地變數

4: iload_2 //將第2個int型本地變數推送至棧頂

5: iconst_5 //將int型5推送至棧頂,也就是for迴圈中的 最大值5

6: if_icmpge 20 //比較棧頂兩int型數值大小,當結果大於等於0時跳轉,

//也就是比較0是否大於等於5,(cpmge指compare larger equals),如果是跳轉到到第20條指令

9: fload_1 //將第1個float型本地變數推送至棧頂,也就是變數num

10: iload_2 //將第2個int型本地變數推送至棧頂,也就是for迴圈中的變數i

11: i2f //int型強轉為float型,也就是把變數i強轉成float

12: fmul //將棧頂兩float型數值相乘並將結果壓入棧頂,也就是i與num相乘

13: fstore_1 //將棧頂float型數值存入第1個本地變數,也就是之前i與num的乘積

14: iinc 2, 1 //將指定int型變數增加指定值,將第2個int型本地變數增加1,

//可以看到,第2個int型本地變數就是之前的變數i

17: goto 4 //無條件跳轉到指令4,實現迴圈效果

20: fload_1 //將第1個float型本地變數推送至棧頂

21: freturn //從當前方法返回float


public class MainActivity extends AppCompatActivity {
    public MainActivity() {
    }

    public int calc() {
        int a = 500;
        int b = 200;
        int c = 50;
        return (a + b) / c;
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(2130968603);
    }
}

他的位元組碼檔案 javap -c

public class zew.testdemo.MainActivity extends android.support.v7.app.AppCompatActivity {
  public zew.testdemo.MainActivity();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method android/support/v7/app/AppCompatActivity."<init>":()V
       4: return

  public int calc();
    Code:
       0: sipush        500
       3: istore_1
       4: sipush        200
       7: istore_2
       8: bipush        50
      10: istore_3
      11: iload_1
      12: iload_2
      13: iadd
      14: iload_3
      15: idiv
      16: ireturn

  protected void onCreate(android.os.Bundle);
    Code:
       0: aload_0
       1: aload_1
       2: invokespecial #2                  // Method android/support/v7/app/AppCompatActivity.onCreate:(Landroid/os/Bundle;)V
       5: aload_0
       6: ldc           #4                  // int 2130968603
       8: invokevirtual #5                  // Method setContentView:(I)V
      11: return
}

這裡額外要說的就是,在非靜態方法中,aload_0 表示對this的操作,在static 方法中,aload_0表示對方法的第一引數的操作。

以上是三個比較簡單的例子,讀者看懂後可以從位元組碼為切入點,去著手分析下為何switch比if else效率高。

相關推薦

JVM指令整理

看位元組碼從這裡開始。 指令碼 助記符 說明 0×00 nop 什麼都不做 0×01 aconst_null 將null推送至棧頂 0×02 iconst_m1 將int型-1推送至棧頂 0×03 ico

JVM指令介紹

fse inf clas -s val 轉載 signed sig icm 轉載自:http://glutinit.iteye.com/blog/1263446 延伸參考 JVM接收參數和方法調用 void spin() { int i; for

JVM指令及各指令的詳細使用說明

指令碼 助記符    說明   0x00 nop      什麼都不做   0x01 aconst_null 將null推送至棧頂   0x02 iconst_m1   將int型-1推送至棧頂   0x03 iconst_0   將int型0推送至棧頂   0x04 iconst_1   將int

linux指令整理

Tap:命令補全,檔案命令補全 ctrl+c:終止正在執行的程式 硬實時與軟實時: 硬實時系統有一個剛性的,不可改變的時間限制, 它不允許任何超出時限的錯誤。軟實時的時限柔 性靈活,可以容忍偶然的超時錯誤。 兩者最關鍵的差別在於,軟實時只能提供統計意 義上的實時。例如,使用者操作DVD時,只要98

JVM學習05-位元組碼執行過程和JVM指令

1. 位元組碼的Code部分 在執行位元組碼的時候,無非也就是對呼叫類中的函式。那麼下面將介紹下位元組碼函式的Code部分,Code部分的程式碼一個可以用java自帶的命令javap命令進行檢視。還可以在eclipse中安裝ByteCode visualize

jvm 指令

JVM指令助記符 變數到運算元棧:iload,iload_<n>,lload,lload_<n>,fload,fload_<n>,dload,dload_<n>,aload,aload_<n> 運算元棧到變數:ist

java反彙編及JVM指令(指令碼、助記符、功能描述)

指令格式:  aastore 功能描述:  根據棧頂的引用型數值(value)、陣列下            標(index)、陣列引用(arrayref)出            棧,將數值存入對應的陣列元素中。 丟擲異常:  如果value的型別和arrayref所引用            的陣

《Java虛擬機原理圖解》4.JVM機器指令

popu 符號 處理 組織 snippet add ide 獲取 alt 0. 前言 Java虛擬機和真實的計算機一樣,執行的都是二進制的機器碼;而我們將.java 源碼編譯成.class 文件,class文件便是Java虛擬機可以認識的

JVM學習筆記1:位元組碼指令

一.位元組碼指令集簡介: Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(operand)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那麼java虛

[三] java虛擬機器 JVM位元組碼 指令 bytecode 操作碼 指令分類用法 助記符

上面關於dup的描述摘自 虛擬機器規範,很難理解看起來是非常難以理解的,不妨換一個角度我們知道區域性變數的空間分配分為兩種long 和 double 佔用2個slot  其他佔用一個運算元棧,每個單位可以表示虛擬機器支援的任何的一個數據型別不過運算元棧其實同區域性變數一樣,他也是被組織一個數組, 每個元素的資

JVM九:class位元組碼指令

一:位元組碼與資料型別     Java虛擬機器的指令由一個位元組長度,代表著某種特定操作含義的數字(稱為操作碼)以及跟其隨後的零至多個代表此操作所需引數(稱為運算元)而構成。Java虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數指令都不包含運算元。因為位元

關於Java虛擬機器二三事(八)---JVM機器指令及其執行引擎

1.前言    Java虛擬機器和真實的計算機一樣,執行的都是二進位制的機器碼;而我們將.java原始碼編譯成.class檔案,class檔案便是Java虛擬機器能夠認識的二進位制機器碼。Java能夠識別class檔案中的資訊和機器指令,進而執行這些機器指令。那麼,Java虛

《Java虛擬機器原理圖解》4.JVM機器指令

0. 前言 Java虛擬機器和真實的計算機一樣,執行的都是二進位制的機器碼;而我們將.java 原始碼編譯成.class 檔案,class檔案便是Java虛擬機器能夠認識的二進位制機器碼,Jav

jvm位元組碼指令

有時候為了能理解JVM對程式所做的優化等,需要檢視程式的位元組碼,因此知道了解一些常見的指令集很重要! 指令碼 助記符 說明 0x00 nop 什麼都不做 0x01 aconst_null 將null推送至棧頂

jvm探祕六:位元組碼指令

概述 java虛擬機器的指令有一個位元組長度的,代表某種特定的操作含義的數字(操作碼)以及跟隨其後的零至多個代表此操作所需引數(運算元)構成。 由於java虛擬機器採用面向運算元棧而不是暫存器的架構,大多數指令都不含運算元,只有一個操作碼。Java虛擬機

整理】SIMD、MMX、SSE、AVX、3D Now!、neon——指令大全

http://blog.csdn.net/conowen/article/details/7255920 SIMD SIMD單指令流多資料流(SingleInstruction Multiple Data,SIMD)是一種採用一個控制器來控制多個處理器,同時對一組資料(

JVM位元組碼指令簡介

Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(Opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(Operands)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那 Java 虛擬機器的直譯器使用下

JVM筆記 -- JVM的發展以及基於棧的指令架構

- 1. 2011年,`JDK7`釋出,1.7u4中,開始啟用新的垃圾回收器`G1`(但是不是預設)。 - 2. 2017年,釋出`JDK9`,`G1`成為預設`GC`,代替`CMS`。(一般公司使用`jdk8`的時候,會通過引數,指定`GC`為`G1`) - 3. 2018年,釋出`JDK11`,帶來了革命

JVM指令重排

解鎖 tile 一個 vol 對象 volatile star 加鎖 interrupt 指令重排的基本原則:   a.程序順序原則:一個線程內保證語義的串行性  b.volatile規則:volatile變量的寫,先發生於讀  c.鎖規則:解鎖(unlock)必然發生在隨

ARM cortex M3寄存器及指令

png cor 另一個 堆棧 應用程序 技術分享 font 限制 帶來 1、cortex M3擁有通用寄存器R0-R15及一些特殊寄存器: R0‐R7 也被稱為低組寄存器。所有指令都能訪問它們。它們的字長全是 32 位,復位後的初始值是不可預料的。 R8‐R12 也被稱為