內存溢出(out of memory)
是指程序在申請內存時,沒有足夠的內存空間供其使用。
例:好比申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。算法
即你要求分配的內存超出了系統能給你的,系統不能知足需求,因而產生溢出。
例:棧滿時再作進棧一定產生空間溢出,叫上溢,棧空時再作退棧也產生空間溢出,稱爲下溢。服務器
內存泄露(memory leak)
是指程序在申請內存後,沒法釋放已申請的內存空間,函數
以發生的方式來分類,內存泄漏能夠分爲4類:
1) 常發性內存泄漏。發生內存泄漏的代碼會被屢次執行到,每次被執行的時候都會致使一塊內存泄漏。
2) 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操做過程下才會發生。常發性和偶發性是相對的。
對於特定的環境,偶發性的也許就變成了常發性的。因此測試環境和測試方法對檢測內存泄漏相當重要。
3) 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者因爲算法上的缺陷,致使總會有一塊僅且一塊內存發生泄漏。
好比,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,因此內存泄漏只會發生一次。
4) 隱式內存泄漏。程序在運行過程當中不停的分配內存,可是直到結束的時候才釋放內存。嚴格的說這裏並無發生內存泄漏,
由於最終程序釋放了全部申請的內存。可是對於一個服務器程序,須要運行幾天,幾周甚至幾個月,不及時釋放內存也可能
致使最終耗盡系統的全部內存。因此,咱們稱這類內存泄漏爲隱式內存泄漏。 測試
從用戶使用程序的角度來看,內存泄漏自己不會產生什麼危害,做爲通常的用戶,根本感受不到內存泄漏的存在。
真正有危害的是內存泄漏的堆積,這會最終消耗盡系統全部的內存。從這個角度來講,一次性內存泄漏並無什麼危害,
由於它不會堆積,而隱式內存泄漏危害性則很是大,由於較之於常發性和偶發性內存泄漏它更難被檢測到。內存
二者關係:
內存泄露堆積嚴重,不管多少內存早晚會被佔光,最終會致使內存溢出。內存泄漏