這段時間一直在看jvm相關的書籍,雖然有點難,至少到目前為止還沒有放棄。寫這篇文章的目的:當做自己這段時間學習的小回顧。本章主要通過幾個**片段,分析下區域性變數表與運算元棧之間的資料傳遞關係,重點講解iload
,istore
,iconst_
,iadd
命令
public void test1()
public void test1();
code:
0: iconst_0
1: istore_1
2: return
因為test1()
是乙個例項方法,所以在區域性變數表中,索引為0的位置會儲存該方法所在類的引用(this),所以才會出現istore_1
而不是istore_0
。
我們對int c = 0
做下拆解,乙個常量0,乙個變數c。
0: iconst_0 //將常量0壓入運算元棧
1: istore_1 //將棧頂出棧,即c=0
2: return //因為是void,沒有返回值
public static void test2()
public static void test2();
code:
0: iconst_0
1: istore_0
2: return
因為test2()
是乙個靜態的方法,不會在區域性變數表中插入任何資料。所以你看到的是istore_0
而不是像程式片段一
中的istore_1
。其他分析跟程式片段一
相同
public int test3()
public int test3();
code:
0: iconst_0
1: istore_1
2: iload_1
3: ireturn
0: iconst_0 //將常量0壓棧
1: istore_1 //將棧頂出棧,及c=0
2: iload_1 //將變數c壓入棧頂
3: ireturn //返回棧定元素
public int test4(int a,int b)
public int test4(int, int);
code:
0: iconst_0
1: istore_3
2: iload_1
3: iload_2
4: iadd
5: ireturn
** 分析
因為test4(int a,int b)
是例項方法,所以在區域性變數表
索引為0的位置會插入this
。
因為test4(int a,int b)
帶有兩個引數,所以在區域性變數索引
索引為1的位置插入a,在索引為2的位置插入b。
0: iconst_0 //將常量0壓棧
1: istore_3 //將棧頂出棧,即c=0,將c儲存到區域性變數表索引為3的位置
2: iload_1 //將區域性變數表中索引為1的變數壓棧,即a壓棧
3: iload_2 //將區域性變數表中索引為2的變數壓棧,即b壓棧
4: iadd //將棧頂兩個元素出棧,做加法,然後把結果再入棧(即a,b出棧,將a+b入棧)
5: ireturn //返回a+b的值
public int test5(int a,int b)
public int test5(int, int);
code:
0: iconst_0
1: istore_3
2: iload_1
3: iload_2
4: iadd
5: istore_3
6: iload_3
7: ireturn
0: iconst_0 //將常量0壓棧
1: istore_3 //將棧頂出棧,及c=0
2: iload_1 //從區域性變數表中載入索引為1的變數壓棧,即a壓棧
3: iload_2 //從區域性變數表中載入索引為2的變數壓棧,即b壓棧
4: iadd //將棧頂兩個元素出棧,做加法,然後將結果壓棧,及a+b壓棧
5: istore_3 //將棧頂元素出棧,並儲存到區域性變數表中,即c=a+b
6: iload_3 //從區域性變數表中載入索引為3的變數壓棧,即c壓棧
7: ireturn //返回棧頂元素,即返回c
PLSQL系列 1 變數
1.標量變數 標量變數是指只能存放單個數值的變數。定義標量變數 identifier constant datatype not null default expr default 用於為變數和常量指定初始值。expr 用於指定初始值的plsql表示式,可以是文字值 其他變數 函式等。2.復合變數 ...
jvm系列文章之jvm 記憶體模型
1.jvm記憶體模型按照執行緒私有與否劃分為兩類,執行緒私有類記憶體 執行緒棧,程式計數器,本地方法棧 和執行緒共享記憶體 堆,方法區or元空間 兩大類 執行緒棧 當類開始執行main方法後,位元組碼執行引擎就會為當前執行緒分配一塊記憶體區域,該區域詳細又可以根據執行的方法為main方法的後續方法分...
C語言系列1 變數
c語言很久之前學過,但是長時間沒有複習,對於其中的一些概念,變得模稜兩可。因此有必要溫習一下。從今天開始,寫乙個c語言複習系列。這個系列從c語言變數開始。c語言屬於高階程式語言,但是,與其他高階程式語言相比較而言,算是較為低階的了。因此,在寫作業系統 微控制器嵌入式系統中,c語言仍然發揮著重要作用。...