1. 程式人生 > >記憶體溢位和記憶體洩漏的區別和如何避免記憶體溢位

記憶體溢位和記憶體洩漏的區別和如何避免記憶體溢位

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢位。

記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被佔光。

memory leak會最終會導致out of memory!

記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是產生溢位。 

    記憶體洩漏是指你向系統申請分配記憶體進行使用(new),可是使用完了以後卻不歸還(delete),結果你申請到的那塊記憶體你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程式。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢位!比方說棧,棧滿時再做進棧必定產生空間溢位,叫上溢,棧空時再做退棧也產生空間溢位,稱為下溢。就是分配的記憶體不足以放下資料項序列,稱為記憶體溢位. 

   以發生的方式來分類,記憶體洩漏可以分為4類: 

1. 常發性記憶體洩漏。發生記憶體洩漏的程式碼會被多次執行到,每次被執行的時候都會導致一塊記憶體洩漏。 
2. 偶發性記憶體洩漏。發生記憶體洩漏的程式碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以

測試環境和測試方法對檢測記憶體洩漏至關重要。 
3. 一次性記憶體洩漏。發生記憶體洩漏的程式碼只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊僅且一塊記憶體發生洩漏。比如,在類的建構函式中分配記憶體,在解構函式中卻沒有釋放該記憶體,所以記憶體洩漏只會發生一次。 
4. 隱式記憶體洩漏。程式在執行過程中不停的分配記憶體,但是直到結束的時候才釋放記憶體。嚴格的說這裡並沒有發生記憶體洩漏,因為最終程式釋放了所有申請的記憶體。但是對於一個伺服器程式,需要執行幾天,幾周甚至幾個月,不及時釋放記憶體也可能導致最終耗盡系統的所有記憶體。所以,我們稱這類記憶體洩漏為隱式記憶體洩漏。 

從使用者使用程式的角度來看,記憶體洩漏本身不會產生什麼危害,作為一般的使用者,根本感覺不到記憶體洩漏的存在。真正有危害的是記憶體洩漏的堆積,這會最終消耗盡系統所有的記憶體。從這個角度來說,一次性記憶體洩漏並沒有什麼危害,因為它不會堆積,而隱式記憶體洩漏危害性則非常大,因為較之於常發性和偶發性記憶體洩漏它更難被檢測到

避免記憶體溢位

OOM即Out Of Memory,一般是由程式編寫者對記憶體使用不當,如對該釋放的記憶體資源沒有釋放,導致其一直不能被再次使用而使記憶體被耗盡的現象。根本的解決辦法是對程式碼進行優化:在記憶體引用上做些處理,使用軟引用,虛引用和弱引用;在記憶體中載入圖片時直接在記憶體中做處理,如邊界壓縮等;建立動態回收記憶體機制;優化Dalvik虛擬機器的堆記憶體分配,自定義堆記憶體大小等。

1.資料庫的cursor沒有關閉

2.構造adapter沒有使用快取Converview

3.呼叫registerReceiver後未呼叫unregisterReceiver

4.未關閉InputStream/OutputStream

5.Bitmap使用未呼叫recycle

6.Context洩漏

7.static關鍵字等

相關推薦

pythonjava的區別(python記憶體管理)

1.Java編譯以後才能執行,Python(指令碼語言)直接就可以執行; Python語法更簡潔 一個完整的Python HelloWorld程式只要一行程式碼:print("Hello World")一個完整的Java HelloWorld需要幾行程式碼:public

java記憶體分配(棧堆的區別聯絡)

Java 把記憶體劃分成兩種:一種是棧記憶體,另一種是堆記憶體。在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配,當在一段程式碼塊定義一個變數時,Java 就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java 會自動釋放掉為該變數分配的記

UnixLinux的區別聯系

源代碼 linux 操作系統 軟件 硬件 }區別:}1) UNIX系統大多是與硬件配套的,而Linux則可運行在多種硬件平臺上. }2) UNIX是商業軟件,而Linux是自由軟件,免費、公開源代碼的. }聯系:}Linux的思想源於Unix }遵從POSIX(可移植操作系統環境)規範的一

Java == ,equals hashcode 的區別聯系

應對 哈希表 返回對象 com 總結 子類 return 地址 內存 1. == java中的==是比較兩個對象在JVM中的地址。比較好理解。看下面的代碼: public class ComAddr{ public static void main(St

視圖表的區別聯系

比較 方式 使用 連接 算法 他在 集合 區別 存在可更新 數據庫中的數據都是存儲在表中的,而視圖只是一個或多個表依照某個條件組合而成的結果集,一般來說你可以用update,insert,delete等sql語句修改表中的數據,而對視圖只能進行select操作。但是也存在可

curlwget的區別使用

自定義 tps code ext htm server 參考 resp blank curl和wget基礎功能有諸多重疊,如下載等。 在高級用途上的curl由於可自定義各種請求參數所以長於模擬web請求,用於測試網頁交互(瀏覽器);wget由於支持ftp和Recursive

rtmprtsp的區別適用範圍

比較 www 實際應用 無損壓縮 使用 cnblogs tcp 參考 網頁 http://www.cnblogs.com/jiayayao/p/6536140.html 1.視頻傳輸   從網絡上接收視頻時首先要解協議(RTSP/RTMP/HTTP),然後是解格式(MK

隱藏覆蓋的區別用法

靜態方法 類的變量 靜態 如何 區別 參數類型 子類重寫 pre 父類 講隱藏和覆蓋之前先看兩個概念:靜態類型和動態類型。 任何一個引用變量都有兩個類型:一個叫靜態類型,也就是定義該引用變量的類型;另一個叫動態類型,也就是該引用實際指向的對象類型。 比如對於兩個類A和類B,

node 當中的 cnpmnpm 的區別使用

ref try 信息 內容 nodejs 說明 registry tps 成功 在安裝nodejs之後會有npm命令 打開命令符輸入之後 輸入node -v(記得-v前空格)查看版本信息 如果顯示出來了就說明安裝成功 然後 npm 可以安裝node插件 cnpm使

進程線程區別聯系

-a 定義 share 運行 基本上 應用 一點 實現 ont 1.定義 進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位. 線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單

empty isset的區別聯系

bsp pty 字符 關系 bool var 否則 其它 釋放 empty 和 isset的區別和聯系 要說它們的聯系,其共同點就是empty()和isset()都是變量處理函數,作用是判斷變量是否已經配置,正是由於它們在處理變量過程中有很大的相似性,才導致對它們的關系認識

隨筆55 Struts1Struts2的區別對比

tro 輸出 servlet 更強 api port java action 接口 Action 類: ? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口,而struts2的Action是接口。 ? Struts

HTML中paddingmargin的區別用法

布局 語法 tom mil strong 替換元素 它的 一段 div   margin(外邊距) 定義:margin是用來隔開元素與元素的間距,發生在元素本身的外部,margin用於布局分開元素使元素與元素互不相幹。 提示:margin: top right bottom

paddingmargin的區別作用及各種場合出現的bug

absolut 之間 包括 net 無法 pfile .com 20px http 一、padding Padding: 包括padding-top, padding-right, padding-bottom, padding-left, 控制塊級元素內部, conte

URLURI的區別聯系

.com 如何 log com 指定 orm 統一資源定位器 pos 通過 首先,URI,是uniform resource identifier,統一資源標識符,用來唯一的標識一個資源。而URL是uniform resource locator,統一資源定位器,它是一種具

Synchronizedlock的區別用法

等等 name log 括號 下使用 沒有 pos nal 輕量級 一、synchronized和lock的用法區別 (1)synchronized(隱式鎖):在需要同步的對象中加入此控制,synchronized可以加在方法上,也可以加在特定代碼塊中,括號中表示需要鎖的

Python breakcontinue的區別 range的使用

次循環 instance col rom post rabl light brush iter # n = 0 # while n < 10: # if n > 3: # break # print(n) # n +=

C++java的區別聯系

討論 重要 優勢 net 類型轉換 總結 沒有 中間件 釋放 今晚,數院的一個兄弟借我Java課本,順便問了一句“Java和C++到底有啥區別啊”。一下子有點問蒙了,“啊額.....運行平臺不同....” "一個在高層,一個在底層...." "執行效率不同......

java sleepwait的區別聯系

mon syn cron lee ava pos div 創建 his 1 object monitor java的每個對象都有一個固有的lock,這個lock就稱為object monitor。 比如method,即方法的方法,它也是有一個monitor。所有,如果一個方

HIbernateMybatis的區別優劣勢[轉載]

統計 算法 高版本 抓取 一級緩存 mybatis sql優化 hiberna 優秀 第一章 Hibernate與MyBatis Hibernate 是當前最流行的O/R mapping框架,它出身於sf.net,現在已經成為Jboss的一部分。 Mybatis 是