線程棧-當前棧幀


假如運行以下Math.hava類

package com.cjc.classload;

public class Math {
    public static final Integer COUNTAGE = 666;

    public static User user = null;

    public int count(){ //一個方法對應一個當前棧幀
        int a = 1;
        int b = 2;
        int c = (a + b)*10;
        return c;
    }

    public static void main(String[] args){
        Math math = new Math();
        math.count();
        user  = new User();

    }
}

那么棧中是如何運作的。

首先將Math.class文件反匯編並存放在Math.txt文件中(javap -c Math.class > Math.txt),可以看到count()方法的代碼執行過程如下

 

 

 接下來通過查詢jvm指令(具體百度一下就可以),這里說一下代碼中幾句的意思:

  iconst_1意思是將int類型常量1壓入棧,

  istore_1意思是將int類型值存入局部變量1,

  iload_1意思是從局部變量1中裝載int類型值,

  iadd意思是執行int類型的加法,

  bipush意思是將常數放入操作數棧,

  imul意思是執行int類型的乘法。

接下來一句一句來演示:

 

 

iconst_1:將int類型常量1壓入操作數棧

 

 

 istore_1:在局部變量表中開辟空間保存a變量,再將操作數棧中的1出棧並賦給a

 

 

 iconst_2:將int類型常量2壓入操作數棧

 istore_2:在局部變量表中開辟空間保存b變量,再將操作數棧中的2出棧並賦給b

 

 

 iload_1:從局部變量1也就是a變量裝載1入操作數棧

 iload_2:從局部變量2也就是b變量裝載2入操作數棧

 

 

 iadd:從棧頂彈出兩個int類型的數進行相加操作,結果再入棧

 

 

 bipush:將常量值10入棧

 

 

 imul:從棧頂彈出兩個int類型的值進行乘法操作,結果再入棧

 

 

 istore_3:在局部變量表中開辟空間保存c變量,再將操作數棧中的30出棧並賦給c

 

 iload_3:從局部變量3也就是c變量裝載30入操作數棧

 

 ireturn:將操作數棧中的int類型的數30返回

 不是結尾的總結:

  1、堆和方法區是線程共享的;棧、本地方法棧、程序計數器是線程私有的。

  2、棧的默認內存大小是1M。可以通過-Xss+大小設置,如設置為-Xss128k

  

 

   3、棧中局部變量表若存儲的是引用類型變量如對象等,則存的是地址值,指向堆中的對象。

  4、操作數棧:就是存放接下來要被操作的數,可以理解為臨時存放區。

  5、動態鏈接:在程序運行期間將符號引用替換為直接引用的過程就是動態鏈接。

  6、方法出口:指向方法結束后接下來要執行的代碼。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM