第二章 直接 VS 自動
內存管理
內存管理是這樣的一些過程,識別哪些對象不再有用,回收(釋放)這些對象使用的內存,使這些內存在隨后的分配中可用。在一些編程語言中,
內存分配是程序員的責任。這項復雜的任務導致了很多常見的
錯誤,如怪異、錯誤的程序行為和程序崩潰。結果是,
開發人員很大比例的時間都
在調試解決這些錯誤。
在直接內存管理的程序中經常犯的一個錯誤是懸掛引用(dangling references)。對象使用的空間被回收時,可能還有其他對象引用著。如果
一個對象擁有這樣(懸掛)的引用,當它試圖訪問原始對象時,很可能這塊空間已經分配給了新的對象,結果導致了未預期的訪問。
另外一個在直接內存管理中常見的錯誤是內存泄露(space leaks)。內存分配完不再使用后卻沒有釋放就會產生這樣的錯誤。例如,你打算釋放
一個鏈表(linked list)使用的空間時犯了一個錯誤,只回收了鏈表的第一個對象,其余的對象就不再被引用了,然而這些對象脫離了程序的控
制,再也無法使用或恢復。如果產生了足夠的泄露,內存將持續消耗,直到再也沒有可用的部分。
作為替代方案,一種稱為垃圾收集(garbage collector)的自動內存管理方法正在被廣泛使用,尤其是在現代的面向對象語言中。自動內存管理
使得編寫出更多抽象的接口、更多穩定
代碼成為可能。
垃圾收集避免了懸掛引用
問題,因為被某處引用的對象永遠不會被收集,內存不會被釋放。垃圾收集同樣解決了上面提到的內存泄露問題,因為不
再被引用的內存將自動釋放。
(譯注:實際上
java中依然有“內存泄露”問題,只是這種泄露與上文中提到的傳統上的泄露不同。可以理解為對內存的不恰當使用,會導致垃圾收
集頻繁發生[本應存儲對象的沒有存儲下來],或OOM錯誤[本來應釋放的內存沒有釋放]。)
上一篇:
JAVA內存管理(一)綜述和介紹
此文已轉移到:
http://www.xiegq.com/2013/09/14/25.html