標籤:總結 記憶體回收機制 nts 定義 color 重要 ace address 這不
關於記憶體這一部分的處理,在程式中是極為重要的,這不僅關乎程式啟動並執行速度而且還會對程式能否正常運行,以及對支援程式啟動並執行硬體裝置也是同樣有需求的。小編也是把自己最近接觸到的寫出來,如有錯誤之處,懇請大家斧正。
在程式的運行過程中,會把記憶體分割成很多部分,這篇文章主要講解堆棧的問題。
何為棧?
運行時對象區,就是所有在方法中定義的變數,變數的存放區,則為棧記憶體。隨著方法的結束,棧記憶體也會自然摧毀。
何為堆?
運行時資料區,就是所有在方法中建立對象時,這個對象存放的地方,則為堆記憶體。在堆記憶體的對象可以被反覆利用,不會伴隨方法的結束而銷毀。
圖中講解的主要是定義變數和給變數賦值時關於記憶體分析的處理。
值傳遞和址傳遞
隨帶說一下值傳遞(實值型別)和址傳遞(參考型別)結合記憶體分析一下。
值傳遞
public class Value { public static void main(String[] args) { int a = 6; int b = 9; swap(a,b); System.out.println("交換之後 a的值是:" + a + ";b的值是:" + b); } public static void swap(int a,int b) { int temp = a; a = b; b = temp; System.out.println("swap方法裡 a的值是:" + a + ";b的值是:" + b); } }
運行結果
記憶體分析
址傳遞
1 public class address{ 2 3 public static void swap(DataWrap dw){ 4 int temp = dw.a; 5 dw.a = dw.b; 6 dw.b = temp; 7 System.out.println("swap方法裡 a的值是:" + dw.a + ";b的值是:" + dw.b); 8 } 9 public static void main(String[] args){ 10 DataWrap dw = new DataWrap(); 11 dw.a = 6; 12 dw.b = 9; 13 swap(dw); 14 System.out.println("交換之後 a的值是:" + dw.a + ";b的值是:" + dw.b); 15 } 16 } 17 class DataWrap{ 18 int a; 19 int b; 20 }
運行結果
記憶體分析
上邊兩個方法不同之處在於一個傳的是實值型別的,而另一個傳遞是參考型別,後者伴隨方法的結束,其儲存資料的棧也被銷毀,指向堆地區的指標消失了。而前者的資料儲存在當前方法的棧用,依舊存在。
【總結】
主要是何時會產生棧和堆記憶體,深入的記憶體還得慢慢學習啊。關於記憶體的回收,Java中記憶體回收機制,當對象不再被引用,建議把對象設為null,便於記憶體回收機制的識別,加快回收速度。
【Java基礎】——淺談堆棧記憶體