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