Java數組---棧內存與堆內存的區別(通過數組講解)

Java數組
在進入講解主題“-棧內存與堆內存的區別”之前,先來講解一下數組,所謂數組,就是若干個相同數據類型的元素按一定順序排列的集合。
一維數組的定義:
數據類型[ ] 數組名;
數組名 = new 數據類型[個數];

針對於Java數組,Java語言把內存分爲兩種:-棧內存和堆內存。
棧內存:
在方法中定義的一些基本類型的變量和對象的引用變量都在方法的棧內存中分配,當在一段代碼塊中定義一個變量時,Java就在棧內存中爲這個變量分配內存空間,當超出變量的作用域後,Java會自動釋放掉爲該變量所分配的內存空間。
堆內存:
堆內存用來存放 new 運算符創建的對象和數組,在堆中分配的內存,由Java虛擬機的自動垃級回收器來管理。在堆中創建了一個數組或對象後,同時還在棧中定義一個特殊的變量,讓棧中的這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量,引用變量實際上保存的是數組或對象在堆內存中的首地址(也稱爲對象的句柄),以後就可以在程序中使用棧的引用變量訪問堆中的數組或對象。引用變量就相當於是爲數組或對象起的一個名稱。引用變量是普通的變量,定義時在找中分配,引用變量在程序運行到其作用域之外後被釋放。而數組或對象本身在堆內存中分配,即使程序運行到使用new運算符創建數組或對象的語句所在的代碼塊之外,數組或對象本身所佔據的內存也不會釋放,數組或對象在沒有引用變量指向它時,會變爲垃圾,不能再被使用,但仍然佔據內存空間不放,在隨後一個不確定的時間被垃圾回收器收走(釋放掉),這也是Java比較佔內存的原因。
小結:
1 棧:爲編譯器自動分配和釋放,如函數參數、局部變量、臨時變量等等
2 堆:爲成員分配和釋放,由程序員自己申請、自己釋放。否則發生內存泄露。典型爲使用 new 申請的堆內容。
爲了方便理解,舉個例子:
如: int [ ] x; //定義了一個數組x,這條語句執行完成後的內存狀態如圖1
x = new int [10]; //數組初始化,這條語句執行完成後的內存狀態如圖2
圖1.只聲明瞭數組,而沒有對其分配內存空間圖1.只聲明瞭數組,而沒有對其分配內存空間
圖2.聲明數組並分配相應的內存空間,引用變量指向數據對象圖2.聲明數組並分配相應的內存空間,引用變量指向數據對象

執行第2條語句"x=new int [10];“後,在堆內存中創建了一個數組對象,爲這個數組對象分配了10個整數單元,並將數組對象賦給了數組引用變量x,引用變量就相當於C語言中的指針變量,而數組對象就是指針變量指向的那個內存塊。所以說在Java內部還是有指針的,只是把指針的概念對用戶隱藏起來了,而用戶所使用的是引用變量。
用戶也可以改變x的值,讓它指向另外一個數組對象,或者不指向任何數組對象。要想讓x不指向任何數組對象,只需要將常量 null 賦給x即可。如x=null;,這條語句執行完後的內存狀態如圖3所示。
執行完"x=null;”,語句後,原來通過new int [10]產生的數組對象不再被任何引用變量所引用,變成了“孤兒”,也就成了垃圾,直到垃圾回收器來將它釋放掉.
圖3.引用變量與引用對象斷開
圖3.引用變量與引用對象斷開

棧內存與堆內存的區別講述完畢,迷路的你,是否看到了些許光芒。
爲每一個不死心的明天而拼命的今天,都是2019年11月19日21點24分。
剛剛結束今天的馬原期中,Java加油啊!

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