目錄
一、棧內存(stack)
1)定義:編譯器自動分配和釋放的一塊內存區域,類似於數據結構的棧;
2)存放內容:定義在方法中、局部代碼塊中的局部變量;
3)管理:所佔用的空間直到相對應的代碼塊、方法執行完就立即自動釋放;
4)優點:存取速度快,僅次於寄存器,數據可共享;
5)缺點:數據大小與生存期必須是確定的,缺乏靈活性。
二、堆內存(heap)
1)定義:程序運行時動態分配的內存區域,類似於數據結構的鏈表;
2)存儲內容:通過new建立的實體,每一個實體都有自己的內存地址值,實體中的變量都有默認的初始化值;
3)管理: 當實體不再被使用的時候,會在不確定的時候,由垃圾回收器 (GC)回收(釋放空間);
4)優點:動態“按需分配”內存大小,生存期不必事先告訴編譯器,使用完畢後,GC會自動收走這些不再使用的內存塊;
5)缺點:由於要在運動時才動態分配內存,相比於棧內存,它的存取速度較慢。
三、垃圾回收機制 (GC)
1)垃圾生成時間:當一個堆內存中的對象在棧中沒有引用指向它的時候,這個對象就被JVM視爲垃圾;
2)垃圾回收時間:垃圾不會被立刻回收,而是在未知的時間點,JVM啓動GC來回收這個對象所佔用的空間,無需手動清理;
PS:
int[] x =new int[3];
int[] y =x;
y[1] =89;
x =null;
這段程序執行完之後,在堆內存中有沒有垃圾對象?
分析:由於x變成null之前,已經把數組的首地址的值傳給了y,所以x變成null之後,y還是指向了內存中的數組對象,程序執行完之後,對內存中的數組對象在棧內存中仍然有引用變量指向它,所以堆內存中沒有垃圾對象。
如圖:
JAVA基礎篇專欄持續更新中,更多JAVA基礎知識請移步專欄垂閱,希望對您有幫助!