1. 程式人生 > >java程式設計——JAVA 中的棧與堆

java程式設計——JAVA 中的棧與堆

簡介

JAVA在程式執行時,在記憶體中劃分5片空間進行資料的儲存。分別是:

  1. 暫存器。
  2. 本地方法區。
  3. 方法區。
  4. 棧。
  5. 堆。

棧stack和堆heap這兩個概念很重要

棧:

  1. 函式中定義的基本型別變數,物件的引用變數都在函式的棧記憶體中分配。
  2. 棧記憶體特點,數資料一執行完畢,變數會立即釋放,節約記憶體空間。
  3. 棧記憶體中的資料,沒有預設初始化值,需要手動設定。

堆:

  1. 堆記憶體用來存放new建立的物件和陣列。
  2. 堆記憶體中所有的實體都有記憶體地址值。
  3. 堆記憶體中的實體是用來封裝資料的,這些資料都有預設初始化值。
  4. 堆記憶體中的實體不再被指向時,JVM啟動垃圾回收機制,自動清除,這也是JAVA優於C++的表現之一(C++中需要程式設計師手動清除)。

示例1

main()

int x=1;

show ()

int x=2

主函式main()中定義變數int x=1,show()函式中定義變數int x=1。最後show()函式執行完畢。

小編是一個有著5年工作經驗的java程式設計師,對於java,自己有做資料的整合,一個完整學習java的路線,學習資料和工具,相信這裡有很多學習java的小夥伴,我創立了一個2000人學習扣群,479121291。每晚都有java的直播課程。無論是初級還是進階的小夥伴小編我都歡迎!

以上程式執行步驟:

第1步——main()函式是程式入口,JVM先執行,在棧記憶體中開闢一個空間,存放int型別變數x,同時附值1。

第2步——JVM執行show()函式,在棧記憶體中又開闢一個新的空間,存放int型別變數x,同時附值2。此時main空間與show空間並存,同時執行,互不影響。

第3步——show()執行完畢,變數x立即釋放,空間消失。但是main()函式空間仍存在,main中的變數x仍然存在,不受影響。

示意圖:

java程式設計——JAVA 中的棧與堆

 

示例2

main()

int[] x=new int[3];

x[0]=20

主函式main()中定義陣列x,元素型別int,元素個數3。

第1步——執行int[] x=new int[3];

JVM執行main()函式,在棧記憶體中開闢一個空間,存放x變數(x變數是區域性變數)。同時,在堆記憶體中也開闢一個空間,存放new int[3]陣列,堆記憶體會自動記憶體首地址值,如0x0045。

陣列在棧記憶體中的地址值,會附給x,這樣x也有地址值。所以,x就指向(引用)了這個陣列。此時,所有元素均未附值,但都有預設初始化值0。

第2步——執行x[0]=20 即在堆記憶體中將20附給[0]這個陣列元素。這樣,陣列的三個元素值分別為20,0,0

示意圖:

java程式設計——JAVA 中的棧與堆

 

示例3

Car c=new Car;

c.num=5;

Car c1=c;

c1.color="green";

c.run();

Car c1=c,這句話相當於將物件複製一份出來,兩個物件的記憶體地址值一樣。所以指向同一個實體,對c1的屬性修改,相當於c的屬性也改了。

示意圖:

java程式設計——JAVA 中的棧與堆