關於記憶體洩漏和記憶體溢位的問題

2021-08-18 19:15:23 字數 1121 閱讀 7192

很早就想寫這篇部落格,一直沒有時間,開篇一句話概括兩者的關係:記憶體洩漏導致記憶體溢位 ;

那就先說一下記憶體洩漏吧,某乙個位置的記憶體洩漏,或者說導致一次記憶體洩漏沒有什麼大的影響,但是累積起來多了,那就造成了oom記憶體溢位的錯誤了,那麼什麼是記憶體洩漏呢換句話說什麼能導致記憶體洩漏呢,怎樣避免記憶體洩漏呢?

首先我們都知道我們物件導向程式設計最重要的就是物件,那麼物件都有自己的記憶體位址,當我們使用的時候就去建立,然後就新建了乙個位址,但是當我們以後不用或者當時用不到的時候,那麼有沒有及時的銷毀或者釋放呢?如果沒有,那麼這個物件就會一直存在記憶體裡邊;

另外乙個解釋,類的引用,我們都知道,在某乙個類建立的時候,在很多地方都可以去引用,呼叫其中的方法,但是當我們這個類關閉也就是銷毀之後,在其他類使用這個類的引用物件的時候又會被「啟用」。又或者這個記憶體位址我們「丟了」,也就是我們找不到引用了,那麼這個物件又會存在於記憶體中無法被及時的釋放 ; 

在舉乙個情況,我們經常在非ui執行緒傳送handler傳送定時任務去處理相關動作,可是關閉activity之後呢?這個handler找不到這個activity的類引用了,也會發生記憶體洩漏(這種情況一般不會出現,因為沒有人這樣去做);

再有一種情況,也是我們**中導致記憶體溢位的乙個大的原因,的記憶體洩漏,我們都知道渲染是乙個bitmap物件,那麼系統在建立的時候自然會給出記憶體大小去載入這個,當這個bitmap太大的時候,記憶體不夠去渲染去建立;又或者一次使用之後沒有呼叫bitmap的recycle()銷毀物件方法,那麼多次渲染後也會發生記憶體洩漏的錯誤 。

再來乙個,cursor指標物件對於用過安卓內部資料庫的人不算陌生吧,我們這個物件在用過之後或者長時間不用的時候一定記得要去釋放 ,最早的時候發生記憶體洩漏也就是他了。等等還有很多情況會導致記憶體洩漏,但是大部分原因都是因為引用沒有得到及時的釋放出現的問題。以下還有這幾種情況:

1.使用adapter時,沒有使用系統快取的converview 

2.沒有即時呼叫recycle()釋放不再使用的bitmap 

4.廣播註冊沒取消造成記憶體洩露 

5.handler應該申明為靜態物件, 並在其內部類中儲存乙個對外部類的弱引用。

現在就來說一下記憶體溢位吧,1,建立物件的時候申請的記憶體少,不夠存下將要存入的物件或者資料,這樣就會導致記憶體溢位 2,記憶體洩漏嚴重,長期不釋放記憶體位址,會導致記憶體溢位 。

記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位

記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...

記憶體溢位和記憶體洩漏

記憶體溢位 oom 指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現oom 記憶體洩露memory leak 指程式在申請記憶體後,無法釋放已申請的記憶體空間,一直占用著這塊記憶體空間。記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是產生溢位。記憶體洩漏是指你向系統...

記憶體溢位和記憶體洩漏

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory 比如申請了乙個integer,但給它存了long才能存下的數,那就是記憶體溢位。記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記...