假如運行以下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、方法出口:指向方法結束后接下來要執行的代碼。
