簡單理解Java堆棧

       Java中把變量內存區域劃分成兩種:一種是棧內存,一種是堆內存。

       一些基本類型的變量數據和對象的引用變量都在棧內存中分配。當定義一個變量時,在棧中會爲這個變量分配內存空間,當該變量退出該作用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間可以立即被另作他用。每一個線程包含一個棧區,每個棧中的數據(原始類型和對象引用都是私有的,其他棧不能訪問。

       由new關鍵字創建的對象和數組,在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或對象後,在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。數組和對象本身在堆中分配,即使程序運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身佔據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變爲垃圾,不能再被使用,但仍然佔據內存空間不放,在隨後的一個不確定的時間被垃圾回收器回收釋放掉。這也是java比較佔內存的原因。實際上,棧中的變量指向堆內存中的變量,可認爲是java中的指針。需要注意的是jvm只有一個堆區(heap)被所有線程共享。

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