Java內存分配(堆和棧內存)

在學習Java數組之前,需要先了解一下Java的內存分配機制。Java內存分佈分爲堆內存和棧內存兩種。


棧內存

在方法中定義的一些基本類型的變量和引用都是在(方法的)棧內存中申請的。當一段代碼定義一個基本類型的變量時,Java就會在棧內存中爲這個變量申請一塊內存空間,而當這個變量超出這段代碼(即作用域)時,Java就會自動收回該空間,這個變量也就不復存在。

堆內存

堆內存中存放的都是由new申請出來的空間。在堆中申請的內存,由JVM自動垃圾回收期來管理。在堆中創建了一個數組或對象之後,還會在棧中定義一個特殊變量,讓這變量指向數組或變量在堆內存中的首地址,棧中的這個變量實際上就是堆中變量的引用變量,引用變量保存的實際是引用對象的首地址(也稱爲句柄),以後就可以用棧中的對象來訪問堆中的對象。所以說棧中的引用變量就相當於堆中變量的一個名稱。引用變量也是普通變量,定義時在棧中分配,並在程序運行到作用域之外時被自動釋放。而對於它指向的堆中的對象,堆中的對象並不會被立即釋放,當運行到作用域之外後,它就會變成垃圾,不能再被使用,但仍佔據一定的內存空間,隨後在一個不缺定的時間被JVM釋放掉。因此Java程序容易佔有大量內存。
在這裏引用一句話:“初學者不用管他是怎麼回收垃圾的,反正他會自動回收。當你有一定基礎了,學下java虛擬機方面的東西就瞭解他是怎樣實現回收的了,而且這個時候去了解的話更容易接收些。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章