JVM棧記憶體

2021-10-10 09:20:06 字數 2175 閱讀 8568

乙個方法相當於乙個棧幀,下面進行結構和過程解析:

說白了就是存放方法內部定義的區域性變數(8大基本資料型別),(string引用型別),(物件引用8大基本資料型別:int、short、byte、double、char、boolean、float、long

string引用型別:string是個final類和八大資料型別對應的引用型別是一樣一樣的。

物件引用注(重點):其實講了這麼多,可能對變數,常量,string引用型別,八大資料型別的封裝類,常量池.....他們的存放位置在哪?

首先先區分變數和常量的區別

常量:常量代表程式執行過程中不能改變的值。也就是用final修飾

例如:final double pi = 3.14;

變數:變數是程式執行中,其值可以改變量

例如:double pi = 3.14;

定義在類中方法外:

1.成員變數(非靜態的)(八大基礎資料型別)和常量(非靜態的)(final定義的八大基礎資料型別)都在堆

2.成員變數(靜態的)(八大基礎資料型別)和常量(靜態的)(final定義的八大基礎資料型別)都在方法區,在jdk1.8的時候通過hotspot技術移到了元空間,元空間在本地記憶體中。

3.string常量池在jdk1.8的時候通過hotspot技術移到堆中。

4.string成員變數分配在堆,這個宣告是在方法區,實際物件是在堆,中間只是個引用。

5.常用的八大引用型別,在範圍內的分配在方法區內 範圍外(new例項化)的分配在堆,範圍外的宣告是在方法區,實際物件是在堆,中間只是個引用。

6.new例項化存放在堆,宣告是在方法區,實際物件是在堆。

定義在類中方法內:

1.區域性變數(包括靜態的)(八大基礎資料型別)和區域性定義常量(包括靜態的)(final定義的八大基礎資料型別)都是在棧中

2.string分配在堆,宣告是在棧,實際物件是在堆,中間只是個引用。

3.常用的八大引用型別看資料範圍,因為有自動拆裝箱,在範圍內的分配在棧 範圍外(new例項化)的分配在堆,宣告是在棧,實際物件是在堆,中間只是個引用。

4.new例項化存放在堆,宣告是在棧,實際物件是在堆,中間只是個引用。

所以這裡就涉及到位址和值的問題,也就是==和equals的區別。

指在位元組碼檔案中,常量池指向呼叫方法的引用,意思也就是,在方法中呼叫方法,給被呼叫的方法乙個標識,告訴你們這是個方法,和其他的資訊區別開。

這個說白了,就是程式要退出這個方法了,要告訴棧幀,我要退出去了,回到被呼叫的位置,你要幫我儲存一下方法執行中處理的資訊,異常退出就不用儲存了,然後程式計數器指向下一條指令開始執行。在我們平時debug就知道,當乙個方法呼叫完畢後,最後會回到呼叫的位置,也就是入口位置。

hotspot提出了棧頂快取技術,目的是為了減少頻繁使用入棧和出棧的指令,減少了io的開銷

執行過程:

1.這裡的運算元棧僅僅只是作為乙個快取

2.變數賦值,首先數值入棧,然後再出棧找到對應區域性變數表裡面的下標

3.任何需要進行計算的資料都是先入棧再出棧進行計算後,結果再入棧,然後再出棧找到對應區域性變數表裡面的下標。

jvm記憶體模型 JVM記憶體模型詳情解析

一 結構圖 note string常量池 存在 堆記憶體中 二 各部分詳情解析 1 堆1 老年代 物件年齡 經過一次 monitor gc 年齡加1 15 的會存到 老年代 2 年輕代 3 常量池 string常量 儲存在堆中 2 虛擬機器棧 1 區域性變數表 2 運算元棧 3 動態鏈結 4 方法出...

JVM記憶體劃分

從上圖可以看出,jvm記憶體區域可以簡單的劃分為方法區,堆區,虛擬機器棧,本地方法棧和程式計數器。上圖中,淺色的為執行緒共有的記憶體區域,深色的為執行緒私有的記憶體區域。可以看出,方法區和堆區是所有執行緒之間共享的記憶體區,而棧區和pc則是執行緒本身私有的,不能被其他執行緒所共享。我們簡單的說下各個...

jvm記憶體模型

主要分為棧,堆,方法區,程式計數器 1.程式計數器 2.棧 stack 虛擬機器棧 每個執行緒獨生成乙個棧,執行緒中每呼叫乙個方法生成乙個棧幀,棧幀依次壓棧 棧幀中存放了每個方法的基本資料變數,物件的引用,操作指令,出口資訊等 本地方法棧 存放的是native方法 其他語言寫的 其他和虛擬機器棧一樣...