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 中的棧與堆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章