JVM是基于堆棧的虛擬機.JVM為每個(gè)新創(chuàng )建的線(xiàn)程都分配一個(gè)堆棧.也就是說(shuō),對于一個(gè)Java程序來(lái)說(shuō),它的運行就是通過(guò)對堆棧的操作來(lái)完成的。堆棧以幀為單位保存線(xiàn)程的狀態(tài)。JVM對堆棧只進(jìn)行兩種操作:以幀為單位的壓棧和出棧操作。
我們知道,某個(gè)線(xiàn)程正在執行的方法稱(chēng)為此線(xiàn)程的當前方法.我們可能不知道,當前方法使用的幀稱(chēng)為當前幀。當線(xiàn)程激活一個(gè)Java方法,JVM就會(huì )在線(xiàn)程的Java堆棧里新壓入一個(gè)幀。這個(gè)幀自然成為了當前幀.在此方法執行期間,這個(gè)幀將用來(lái)保存參數,局部變量,中間計算過(guò)程和其他數據.這個(gè)幀在這里和編譯原理中的活動(dòng)紀錄的概念是差不多的.
從Java的這種分配機制來(lái)看,堆棧又可以這樣理解:堆棧(Stack)是操作系統在建立某個(gè)進(jìn)程時(shí)或者線(xiàn)程(在支持多線(xiàn)程的操作系統中是線(xiàn)程)為這個(gè)線(xiàn)程建立的存儲區域,該區域具有先進(jìn)后出的特性。
每一個(gè)Java應用都唯一對應一個(gè)JVM實(shí)例,每一個(gè)實(shí)例唯一對應一個(gè)堆。應用程序在運行中所創(chuàng )建的所有類(lèi)實(shí)例或數組都放在這個(gè)堆中,并由應用所有的線(xiàn)程共享.跟C/C++不同,Java中分配堆內存是自動(dòng)初始化的。Java中所有對象的存儲空間都是在堆中分配的,但是這個(gè)對象的引用卻是在堆棧中分配,也就是說(shuō)在建立一個(gè)對象時(shí)從兩個(gè)地方都分配內存,在堆中分配的內存實(shí)際建立這個(gè)對象,而在堆棧中分配的內存只是一個(gè)指向這個(gè)堆對象的指針(引用)而已。