1. 程式人生 > >深入JVM系列(一)之記憶體模型與記憶體分配

深入JVM系列(一)之記憶體模型與記憶體分配

Java 方法棧也是執行緒私有的,每個 Java 方法棧都是由一個個棧幀組成的,每個棧幀是一個方法執行期的基礎資料結構,它儲存著區域性變量表、運算元棧、動態連結、方法出口等資訊。當執行緒呼叫呼叫了一個 Java 方法時,一個棧幀就被壓入(push)到相應的 Java 方法棧。當執行緒從一個 Java 方法返回時,相應的 Java 方法棧就彈出(pop)一個棧幀。

其中要詳細介紹的是區域性變量表,它儲存者各種基本資料型別和物件引用(Object reference)。基本資料型別包括 boolean、byte、char、short、int、long、float、double。物件引用,本質就是一個地址(也可以說是一個“指標”),該地址是堆中的一個地址,通過這個地址可以找到相應的 Object(注意是“找到”,原因會在下面解釋)。而這個地址找到相應 Object 的方式有兩種。一種是該地址儲存著 Pointer to Object Instance Data 和 Pointer to Object Class Data,另一種是該地址儲存著 Object Instance Data,其中又包含有 Pointer to Object Class Data。如下兩圖所示。


第一種方式,Java 方法棧中有 Handler Pool 和 Instance Pool。無論哪種方式,Object Class Data 都是儲存在方法區的,Object Instance Data 都是儲存在堆中的。


圖1 控制代碼方式


圖2 直接方式

原生方法棧與 Java 方法棧相類似,這裡不再贅述。