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