記憶體溢位發生的幾種情況

2021-08-10 18:53:15 字數 1067 閱讀 4574

之前一直搞不懂記憶體洩漏和記憶體溢位,現在有時間了,仔細研究了一下。

首先:記憶體洩漏:給乙個物件申請一塊記憶體空間,由於某種原因這塊記憶體未釋放掉,這塊記憶體被占用導致應用卡頓等。

記憶體溢位:擁有一塊20位元組的記憶體空間,你將30位元組的檔案寫入其中,就會造成溢位。

由於記憶體洩漏,最終會導致記憶體溢位(oom),導致系統崩潰。

記憶體溢位的幾種情況:

1.靜態activity

如果activity例項被靜態變數引用,在activity被銷毀的時候,若activity例項未被釋放,就會造成記憶體洩漏。

(在activity的ondestory()時,應將該物件釋放掉)

2.靜態view

①單例設計模式應盡量不要使用。(干預activity生命週期的操作,避免這麼做)

②當乙個view物件attach到activity中時,view內部就持有了乙個指向activity的引用。(不要把乙個attach到activity上的view設定為靜態的。)

3.內部類

若封裝乙個內部類,並通過靜態變數擁有了它。(內部類可直接訪問他的外部類的變數,也就是內部類隱式的持有乙個對他的外部類的一用,間接導致了洩漏activity。)

4.匿名類

匿名類也持有乙個指向宣告的它的類的引用。

5.handler

匿名runnable類,將其加入handler處理佇列。在activity被銷毀的時候,若這個訊息還沒有被處理,就有乙個指向activity的引用未被釋放。

6.執行緒

7.定時任務

執行緒、定時任務若通過匿名內部類的方式例項的,即使工作在另一條執行緒,依舊存在乙個指向activity的引用,導致記憶體洩漏。

8.系統服務

通過context的getsystemservice()得到服務。

註冊服務時(系統服務會持有乙個對activity物件的引用),若activity銷毀時忘記取消註冊監聽,就會發生洩漏。

記得給乙個控制項imageview 新增一張,就出現了記憶體溢位的錯誤提示。後來對進行處理之後才使用。在專案的過程中,可能會使用全域性靜態變數等類似的請況,不要忘記對它做處理。否則很可能發生記憶體洩漏,進而導致記憶體溢位。

記憶體洩露的幾種情況

彙總 1.資源物件沒關閉造成的記憶體洩漏,cursor,file檔案等用完後沒有呼叫close,如果我們沒有關閉它,系統在 它時也會關閉它,但是這樣的效率太低了 2.多次使用new同乙個物件,應先判斷物件是否已經為null的情況,為null再new 3.bitmap物件不在使用時呼叫recycle ...

C 記憶體洩漏的幾種情況

1.在類的建構函式和析構函式中沒有匹配的呼叫new和delete函式 兩種情況下會出現這種記憶體洩露 一是在堆裡建立了物件占用了記憶體,但是沒有顯示地釋放物件占用的記憶體 二是在類的建構函式中動態的分配了記憶體,但是在析構函式中沒有釋放記憶體或者沒有正確的釋放記憶體 2.沒有正確地清除巢狀的物件指標...

C 類幾種情況的記憶體布局

對於c 開發者來說,了解其記憶體是非常必要的,同時c 的多型 動態繫結 的原理也是很重要的。c 記憶體布局 需要了解的幾種情況 1 無虛函式,非繼承 class void fun2 private int a 記憶體布局 沒有虛函式,沒有繼承,所以只有成員變數需要分配空間。2 有虛函式,非繼承 cl...