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 也被稱為