在Java虛擬機中,堆和棧是兩個重要的概念。
堆是一塊與程序生命周期無關的內存區域,用于存儲對象及數組。堆的大小可以通過命令行參數或JVM參數進行調整。當創建一個對象時,它會分配在堆上,并返回對象的引用。同時,為了管理堆上的對象,Java虛擬機會使用垃圾回收器來回收無引用的對象。
棧是一種線性結構,用于存儲基本類型(如int、float等)的變量和對象的引用。當一個方法被調用時,Java虛擬機會為該方法分配一塊棧幀,在棧幀中存儲局部變量、操作數棧、返回地址和變量表等信息。當方法結束時,棧幀會被彈出棧,并將返回值壓入調用方法的操作數棧中。
public class StackDemo { public static void main(String[] args) { int a = 1; int b = 2; int sum = add(a, b); System.out.println(sum); } public static int add(int a, int b) { int sum = a + b; return sum; } }
在上面的示例代碼中,main方法首先使用push指令將值1和2壓入棧中。接下來,調用add方法,將上述兩個值作為add方法的參數。當add方法開始執行時,它會分配一個新的棧幀并將參數a和b存儲在棧幀中。由于sum是該方法內部聲明的變量,也會存儲在棧幀中。在執行完sum = a + b后,該方法會將sum值存儲在操作數棧中并返回。此時,main方法中的sum變量會被賦值為add方法的返回值,并打印結果為3。