內存溢位 out of memory,是指程式在申請內存時,沒有足夠的內存空間供其使用,出現 out of memory;比如申請了一個 integer, 但給它存了 long 才能存下的數,那就是內存溢位。
內存泄露 memory leak,是指程式在申請內存後,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積後果很嚴重,無論多少內存, 遲早會被佔光。
memory leak 會最終會導致 out of memory!
內存溢位就是你要求分配的內存超出了系統能給你的,系統不能滿足需求,於是產生溢位。
內存泄漏是指你向系統申請分配內存進行使用 (new),可是使用完了以後卻不歸還 (delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程式。一個盤子用盡各種方法只能裝 4 個果子,你裝了 5 個,結果掉倒地上不能吃了。這就是溢位!比方說棧,棧滿時再做進棧必定產生空間溢位,叫上溢,棧空時再做退棧也產生空間溢位,稱為下溢。就是分配的內存不足以放下資料項序列, 稱為內存溢位.
以發生的方式來分類,內存泄漏可以分為 4 類:
1. 常發性內存泄漏。發生內存泄漏的程式碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。
2. 偶發性內存泄漏。發生內存泄漏的程式碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。
3. 一次性內存泄漏。發生內存泄漏的程式碼只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的建構函式中分配內存,在解構函式中卻沒有釋放該內存,所以內存泄漏只會發生一次。
4. 隱式內存泄漏。程式在執行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裡並沒有發生內存泄漏,因為最終程式釋放了所有申請的內存。但是對於一個站群服務器程式,需要執行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏