Java 中的內存分配

Java 中的內存分配spa

Java 程序運行時,須要在內存中分配空間。爲了提升運算效率,就對空間進行了不一樣區域的劃分,由於每一片區域都有特定的處理數據方式和內存管理方式。對象

 

1、棧:儲存局部變量blog

  • 局部變量:在方法的定義中或者在方法聲明上的變量稱爲局部變量。
  • 特色:棧內存的數據用完就釋放。

2、堆:儲存 new 出來的東西內存

  • 特色:
    • 每個 new 出來的東西都有地址值;
    • 每一個變量都有默認值 (byte, short, int, long 的默認值爲 0;float, double 的默認值爲 0.0;char 的默認值爲 「\u0000」;boolean 的默認值爲 false;引用類型爲 null);
    • 使用完畢就變成垃圾,可是並無當即回收。會有垃圾回收器空閒的時候回收。

 

3、方法區:內存管理

一個對象的運行過程:class

  1. 程序從 main 方法中進入;運行到 Phone p 時,在棧中開闢了一個空間;
  2. new Phone() 時,在隊中開了一個內存空間,此時會有一個內存值爲 0x0001;此時會找到對應的 Phone 的 class 文件,發現有三個變量和三個方法,因而將三個成員變量放在了堆中,可是此時的值爲默認值(具體默認值見上)。注意,在方法區裏也有一個地址值,假設爲 0x001,能夠認爲在堆中也有一個位置,在堆中的位置,能夠找到方法區中相對應的方法;
  3. 繼續運行,p.brand = "三星";將三星賦值給 p.brand,經過棧中的 p 找到了堆中的 brand,此時的 null 值變爲「三星」。剩下的相似;
  4. 當運行到 p.call("喬布斯") 時,經過棧中的 p 找到堆中存在的方法區的內存地址,從而指引到方法區中的 Phone.class 中的方法。從而將 call 方法加載到棧內存中,注意:當執行完畢後,call 方法就從棧內存中消失!剩餘的如上。
  5. 最後,main 方法消失!

 

兩個對象的運行過程:效率

  1. 程序從 main() 方法進入,運行到 Phone p 時,棧內存中開內存空間;
  2. new Phone() 時,在隊中開了一個內存空間,內存值爲 0x0001;此時會找到對應的 Phone 類,發現有三個變量,因而將三個成員變量放在了堆中,可是此時的值爲默認值。又發現該類還存在方法,因而將該方法的內存值留在了堆中,在方法區裏也有一個地址值,假設爲 0x001,這個值與堆中的值相對應;
  3. 程序繼續運行,到 p.brand 時,進行了負值,同上;
  4. 當程序運行到 Phone p2 時;到 new Phone() 時,在堆內存中開闢了內存空間 0x0002,賦值給 Phone p2;
  5. 剩下跟一個對象的內存相同。

 

 

 

三個對象的運行過程:變量

  1. 基本流程跟前兩個無差異;
  2. 可是當運行到 Phone p3 時,在棧內存中分配了一個空間,而後將 p1 的內存賦值給了 p3,即此時 Phone p3 的內存是指向 0x0001 的;
  3. 繼續給變量賦值,會將原來已經賦值的變量給替換掉。

 

 

4、本地方法區(和系統相關)互聯網

5、寄存器(給 CPU 使用)垃圾回收

 

一個材料人跨行到互聯網的研究僧

但願你們能多多關注~

相關文章
相關標籤/搜索