1. 程式人生 > >OOM異常產生的原因和處理方法

OOM異常產生的原因和處理方法

一般而言,android中常見的原因主要有以下幾個: 1.資料庫的cursor沒有關閉。 2.構造adapter沒有使用快取contentview。 3.呼叫registerReceiver()後未呼叫unregisterReceiver(). 4.未關閉InputStream/OutputStream。 5.Bitmap使用後未呼叫recycle()。 6.Context洩漏。 7.static關鍵字等。 接下來分別對這些溢位情況說出解決的思路: 1.針對資料庫cursor沒有關閉的情況,如果我們查詢資料庫得到的資料量比較小的話是不會造成記憶體溢位的,但是如果太大的話就容易發生這種異常,所以當我們在使用完Cursor的時候就應該手動呼叫它的close方法關閉cursor. 2.針對adapter沒有複用convertView的情況,在我們開發的過程中,經常會遇到一個listview載入成百上千條的資料,如果不復用convertView的話就會在每次執行getView方法的時候都建立一個新的物件,而這個方法的呼叫速度又是很快的,java不能夠及時的回收記憶體就會造成OOM異常,這時候除了要在getView方法裡面對convertView進行判斷後複用,還應該使用ViewHolder類來儲存通過過findViewById得到的子控制元件地址值. 3.在activity中註冊了廣播,但是在activity退出的時候沒有取消註冊的話可能會造成記憶體溢位,需要手動的在相應的位置進行反註冊. 4.不關閉輸入輸出流的話就相當於在記憶體和硬碟一直存在著連線佔用著資源,當其他操作需要資源時就會造成記憶體溢位. 5.點陣圖在安卓中佔用的記憶體是很大的,使用後如果不及時回收的話會佔用大量空間,所以針對點陣圖的操作一般有如下解決方案: 1)及時的呼叫resycle方法來手動的回收; 2)設定取樣率,有時候我們不一定要把圖片完全顯示出來,這時候就要按比例來縮放,在我們得到取樣率的時候就可以將圖片縮小後再進行載入,節省大量的記憶體; 3)使用軟引用. 6.上下文洩露 例如在activity中使用了執行緒內部類,這時候線上程記憶體就會儲存一個activity的引用,當activity被銷燬的時候,執行緒仍在執行的話就容易造成oom,因為此時的activity的引用仍然存在沒有被釋放,那麼這個activity就仍然沒有從記憶體中被gc. 7.static關鍵字 開發中使用關鍵字static可以將成員變數和方法變成類變數和類方法,這樣會大大延長變數的生命週期,如果我們過多的使用static來儲存佔用資源過多的物件的引用就會造成記憶體溢位,比如用static修飾一個上下文的物件的話. 第一,應該儘量避免static成員變數引用資源耗費過多的例項,比如Context。 第二、Context儘量使用Application Context,因為Application的Context的生命週期比較長,引用它不會出現記憶體洩露的問題。 第三、使用WeakReference代替強引用。比如可以使用WeakReference<Context> mContextRef;

相關推薦

ConcurrentModificationException: 集合異常——產生原因解決方法

:注意事項:迭代器在使用的時候,有人為了方便,如下使用就會有問題 System.out.println(((Student)it.next()).getName()+”---”+((Student)it.next()).getAge()); 注意事項:迭代器在使用的時候,有人為了方便,如下使

OOM異常產生原因處理方法

一般而言,android中常見的原因主要有以下幾個: 1.資料庫的cursor沒有關閉。 2.構造adapter沒有使用快取contentview。 3.呼叫registerReceiver()後未呼叫unregisterReceiver(). 4.未關閉InputStrea

【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分記憶體溢位異常原因解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變

Content is not allowed in prolog異常產生原因處理方式

web專案在啟動的時候報Content is not allowed in prolog錯誤,後經檢查發現是web專案在使用dom4j/sax 讀取一個xml檔案時報錯。  原因如下:BOM(Byte Order Mark),是UTF編碼方案裡用於標識編碼的標準標記,在UT

Maven編譯jar出現:無法確定 T 的型別引數的異常原因處理方案

[ERROR] [ERROR] /opt/web/iwork_shell/release_jar_workspace/831881fe-9cbe-4444-99d9-5667fcb96263/workspace/src/main/java/com/bj58/biz/utility/JsonUtil.j

android 記憶體溢位(oom產生原因記憶體優化

public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends          AsyncTask<Params, Progress, Result> {      protected

Android逐幀動畫,逐幀動畫載入圖片過多時OOM異常的解決替代方法

1.首先新增逐幀動畫 播放逐幀動畫,在工程中res目錄下建立一個anim資料夾,新增動畫anim_welcome.xml檔案如下: <?xml version="1.0" encoding="utf-8"?> <animation-li

Android 自定義View的post(Runnable)方法非100%執行的原因處理方法解析

最近在寫一個需求,需要在view.post(Runnable)方法當中進行一些操作。但是實際使用中(特定場景)發現並不靠譜。 現象 如果呼叫了view的post(Runnable)方法,該Runnable在View處於detached狀態期間並不會執行;只有當此View或

交越失真及產生原因改善方法

       在分析電路時把三極體的導通電壓看作零,當輸入電壓較低時,因三極體截止而產生的失真稱為交越失真。這種失真通常出現在通過零值處。與一般放大電路相同,消除交越失真的方法是設定合適的靜態工作點,使得三極體在靜態時微導通。 是指在放大電路中,輸出訊號並非是輸入訊號完全

驗證碼 getOutputStream() has already been called for this response異常原因解決方法

1.tomcat5下jsp出現getOutputStream() has already been called for this response異常的原因和解決方法在tomcat5下jsp中出現此錯誤一般都是在jsp中使用了輸出流(如輸出圖片驗證碼,檔案下載等),沒有妥善處理好的原因。 具體的原因就是在

深度學習中“過擬合”的產生原因解決方法

過擬合定義:模型在訓練集上的表現很好,但在測試集和新資料上的表現很差。 訓練集上的表現 測試集上的表現 結論 不好 不好 欠擬合 好 不好 過擬合 好 好 適度擬合 原因 訓練資料集太小,過擬合出現的原因: 模型複雜度過

MySQL的Illegal mix of collationsy異常原因解決方法

ear 代碼 clear 今天 tag 類型 資料 bsp net 原創 2008年12月25日 11:54:00 標簽: mysql / collation / character / variables / database / server 今天

ConcurrentModificationException異常原因解決方法

  在前面一篇文章中提到,對Vector、ArrayList在迭代的時候如果同時對其進行修改就會丟擲java.util.ConcurrentModificationException異常。下面我們就來討論以下這個異常出現的原因以及解決辦法。   以下是本文目錄大綱:   一.Conc

Java ConcurrentModificationException異常原因解決方法

  在前面一篇文章中提到,對Vector、ArrayList在迭代的時候如果同時對其進行修改就會丟擲java.util.ConcurrentModificationException異常。下面我們就來討論以下這個異常出現的原因以及解決辦法。 一.Concur

fetch out of sequence sqlcode = -1002 異常原因解決方法

Cause:    In a host language program, a FETCH call was issued out of sequence. A successful parse-and-execute call must be issued before a fetch. This c

各種異常產生原因及如何處理解決

異常:nested exception is java.lang.IncompatibleClassChangeError: Implementing class 原因:由於jar包衝突引發的異常。導致不相容。 異常:nested exception is java.la

Servlet執行原理及404、500、405異常原因解決方法總結

一、Servlet執行原理 比如,在瀏覽器位址列輸入          http://ip:port/web01/hello 整個通訊流程如下圖所示: 分步解釋:          1、瀏覽器依

session衝突問題產生原因解決方法

背景知識:     1. cookie與session的關係        cookie和session的方案雖然分別屬於客戶端和服務端,但是服務端的session的實現對客戶端的cookie有依賴關係的,上面我講到服務端執行session機制時候會生成session的id

org.springframework.beans.factory.BeanCreationException異常原因解決的方法

今天在啟動專案的tomcat的時突然發現報一下錯誤: 所以在就想著結合之前遇到的問題總結一下,這個bug實際上是說沒有找到對應的bean,而出現這種情況一般有這幾種原因: 1、對bean沒有添加

ClassCastException異常的出現原因解決方法

ClassCastException是JVM在檢測到兩個型別間轉換不相容時引發的執行時異常。此類錯誤通常會終止使用者請求。在執行任何子系統的應用程式程式碼時都有可能發生ClassCastException異常。通過轉換,可以指示Java編譯器將給定型別的變數作為