JVM系列 1 變數

2021-09-16 23:50:39 字數 2684 閱讀 6516

這段時間一直在看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語言仍然發揮著重要作用。...