Java的堆和棧中對象的區別

1、棧中主要存放一些基本類型的變量(int, short, long, byte, float, double, boolean, char)和引用對象。Java中分配堆內存是自動初始化的。

2、Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配。也就是說在建立一個對象時從兩個地方都分配內存,在堆中分配的內存實際建立這個對象,而在棧中分配的內存只是一個指向這個堆對象的指針(引用變量)而已

3、引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外後被釋放。而數組和對象本身在堆中分配,即使程序運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身佔據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變爲垃圾,不能在被使用,但仍然佔據內存空間不放,利用從GC Roots可達性分析算法,不可達的對象在隨後的一個不確定的時間被垃圾回收器收走(釋放掉)。

在Java語言中,可作爲 GC Roots 的對象包括下面幾種:
a. 虛擬機棧(棧幀中的本地變量表)中引用的對象。
b. 方法區中類靜態屬性引用的對象。
c. 方法區中常量引用的對象。
d. 本地方法棧中 JNI(Native方法)引用的對象​​​​​​​

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