JAVA記憶體相關基礎

2021-08-13 08:17:20 字數 2516 閱讀 2092

jvm 記憶體劃分

暫存器:記憶體和 cpu 之間佔的記憶體

本地方法棧:jvm 呼叫了系統的功能(如:呼叫系統的複製貼上)

方法(資料共享區):執行時 class 檔案進入的地方

方法棧:執行時所有方法進入的記憶體

堆:儲存的是容器(如:陣列)和物件

陣列建立過程

壓棧執行:好比上子彈,方法先進入方法棧的最底部

1.首先類進入方法區

2.main 方法進入方法棧,方法棧分配給 main 一塊記憶體

3.當執行 main 方法裡面的建立陣列時,因為建立容器, 所以要在堆記憶體中開 闢一塊空間用於儲存陣列容器,並生成記憶體位址,然後傳給這個陣列的引用 (arr),就是 arr 指向了這個記憶體位址

4.main 方法結束後 arr 消失,因為引用消失,堆記憶體中的資料被**

方法執行記憶體圖(引數為基本型別)

1.首先 .class 檔案進入方法區,其中包含兩個方法

2.main 方法壓棧執行,進入方法棧

3.getarea 方法執行,傳值 5,6

int a = 5; int b =6;

getarea(a,b);

如果這麼寫,傳遞的和還是 5,6 傳遞的是值而不是 a,b

就算是在方法內改變引數的引數 a 的值,也會影響到 main 中的 a

4.getarea 方法出棧,main 方法出棧

方法執行圖(引數為引用型別)

1.建立陣列需要用堆記憶體(具體下面會講)

2.呼叫 change 方法的時候傳遞的是這個引用指向的位址,所以操作的是堆記憶體中的資料。

3.所以 main 中的 arr 也會發生改變,實際是他所指向的堆記憶體中的資料發生了變化

構造方法執行圖

儲存資料的方式

首先說一下棧和堆

棧記憶體:在函式中定義的基本型別變數和物件的引用變數都在棧記憶體中進行分配

堆記憶體:堆記憶體用來存放 new 建立的物件和陣列以及物件的例項變數

1.基本資料型別(在方法中):

如 int a = 3, 由於大小可知,生存期可知(這些字面值定義在某個程式塊裡面,程式塊退出後,字段值就消失了),出於追求速度的原因,就存在於棧中。

另外棧中重要的地方是,棧中的資料可以共享

如:int a = 3; int b = 3;

編譯器先處理 int a = 3; 首先在棧中建立乙個變數為 a 的引用,然後查詢 3 的位址,然後將 a 指向 3 的位址。

然後處理 int b = 3; 建立變數 b 之後,因為棧中已經存在了 3,便將 b 直接指向了 3 的位址。

以上說的是在方法中的基本資料型別,也就是區域性變數,如果基本型別是成員變數,是要跟隨類物件進入存堆記憶體的。

2.物件:

建立乙個物件包括宣告和例項化,

如:

public

class a

}

a a = new a(3);(a 為 new(3) 的引用)

宣告 a 時:在棧記憶體中為物件的引用變數 a 分配空間,這時 a 為空。

例項化時:首先為物件 a 的物件(new a(3))在堆記憶體中分配一塊空間,接著 a 中的成員變數 a 在堆記憶體中分配記憶體,並將其初始化為各資料型別的預設值,因為是 int 預設值為 0,物件的話就是 null,最後呼叫構造方法,為成員變數賦值。返回堆記憶體中物件的引用(位址)。

就算物件為區域性變數時,也是存放在堆記憶體中,但是它的引用 a a 還是放在棧記憶體中的

靜態方法記憶體圖(靜態跟隨類的消失而消失)

1.text.class 進入方法區(資料共享區)

2.載入方法 main 進入靜態區並且攜帶靜態方法所在的類名(在方法區內)

3.person進入方法區,繼續載入自己的靜態成員 classname , 靜態成員也有預設值為 null

4.程式開始執行 main ,jvm 到靜態區將 main 方法複製乙份壓棧執行

5.new person 的時候,在堆記憶體建立乙個物件,複製乙份 string name

java記憶體基礎

段 存放在硬碟載入的 資料段 用來儲存靜態成員 堆記憶體 存放物件和常量池 常量池 存放常量。關於常量池 不僅僅存放常量,也能存放一部分實現常量池的引用型別變數的值。除了浮點型別的包裝型別 integer long等和string型別都實現了,常量池,他們的一部資料可以儲存在常量池中。1 除了浮點型...

java方法呼叫記憶體相關

public class test2 class father public void doget class child extends father public void doget 結果是 child service parent service child doget比較難以理解的是呼叫s...

Java相關學習 5 屬性,static,記憶體

一 屬性 封裝 屬性私有方法公有 無參構造器,有參構造器,set get方法 再寫乙個tostring 方便測試 當屬性變為私有時 一定要寫get,set方法提供獲取和修改屬性 二 static static可以修飾變數也可以修飾屬性和 塊 static修飾的方法在呼叫其他方法時其他方法也應該是st...