1. 程式人生 > >android開發記憶體溢位處理記錄

android開發記憶體溢位處理記錄

在Android開發中,記憶體洩漏是比較常見的問題,有過一些Android程式設計經歷的童鞋應該都遇到過,但為什麼會出現記憶體洩漏呢?記憶體洩漏又有什麼影響呢?

在Android程式開發中,當一個物件已經不需要再使用了,本該被回收時,而另外一個正在使用的物件持有它的引用從而導致它不能被回收,這就導致本該被回收的物件不能被回收而停留在堆記憶體中,記憶體洩漏就產生了。

記憶體洩漏有什麼影響呢?它是造成應用程式OOM的主要原因之一。由於Android系統為每個應用程式分配的記憶體有限,當一個應用中產生的記憶體洩漏比較多時,就難免會導致應用所需要的記憶體超過這個系統分配的記憶體限額,這就造成了記憶體溢位而導致應用Crash。

瞭解了記憶體洩漏的原因及影響後,我們需要做的就是掌握常見的記憶體洩漏,並在以後的Android程式開發中,儘量避免它。下面小編蒐羅了5個Android開發中比較常見的記憶體洩漏問題及解決辦法,分享給大家,一起來看看吧。

一、單例造成的記憶體洩漏

Android的單例模式非常受開發者的喜愛,不過使用的不恰當的話也會造成記憶體洩漏。因為單例的靜態特性使得單例的生命週期和應用的生命週期一樣長,這就說明了如果一個物件已經不需要使用了,而單例物件還持有該物件的引用,那麼這個物件將不能被正常回收,這就導致了記憶體洩漏。

如下這個典例:

1 2 3 4 5 6 7 8 9 10 11 12 13 public class AppManager { private static AppManager instance; private Context context; private AppManager(Context context) { this.context = context; } public static AppManager getInstance(Context context) { if (instance != null) { instance = new AppManager(context); }
return instance; } }

這是一個普通的單例模式,當建立這個單例的時候,由於需要傳入一個Context,所以這個Context的生命週期的長短至關重要:

1、傳入的是Application的Context:這將沒有任何問題,因為單例的生命週期和Application的一樣長 ;

2、傳入的是Activity的Context:當這個Context所對應的Activity退出時,由於該Context和Activity的生命週期一樣長(Activity間接繼承於Context),所以當前Activity退出時它的記憶體並不會被回收,因為單例物件持有該Activity的引用。

所以正確的單例應該修改為下面這種方式:

1 2 3 4 5 6 7 8 9 10 11 12 13 public class AppManager { private static AppManager instance; private Context context; private AppManager(Context context) { this.context = context.getApplicationContext(); } public static AppManager getInstance(Context context) { if (instance != null) { instance = new AppManager(context); } return instance; } }

這樣不管傳入什麼Context最終將使用Application的Context,而單例的生命週期和應用的一樣長,這樣就防止了記憶體洩漏。

二、非靜態內部類建立靜態例項造成的記憶體洩漏

有的時候我們可能會在啟動頻繁的Activity中,為了避免重複建立相同的資料資源,會出現這種寫法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class MainActivity extends AppCompatActivity { private static TestResource mResource = null; @Override protected void onCreate(Bundle savedInstanceState) {

相關推薦

android開發記憶體溢位處理記錄

在Android開發中,記憶體洩漏是比較常見的問題,有過一些Android程式設計經歷的童鞋應該都遇到過,但為什麼會出現記憶體洩漏呢?記憶體洩漏又有什麼影響呢? 在Android程式開發中,當一個物件已經不需要再使用了,本該被回收時,而另外一個正在使用的物件持有它的引用從而導致它不能被回收,

Jmeter記憶體溢位處理方式記錄

方法一:   使用jmeter進行壓力測試時遇到一段時間後報記憶體溢位outfmenmory錯誤,導致jmeter卡死了,先嚐試在jmeter.bat中增加了JVM_ARGS="- Xmx2048m -Xms2048m -Xmn256m -XX:PermSize

Android放置圖片記憶體溢位處理方法

FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://sc

myeclipse記憶體溢位處理的三種處理方法

如果是web工程還是報記憶體溢位,還需設定tomcat記憶體。 Myeclipse配置web伺服器myeclipse—>windows—>preferences—>servers—>tomcat6.x—> JDK的optional java vm arguments配置為:

Android開發之影象處理那點事——濾鏡

code小生,一個專注 Android 領域的技術平臺公眾號回覆 Android 加入我的安卓技

伺服器記憶體溢位處理

1、 PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域OutOfMemoryError: PermGen space從表面上看就是記憶體益出,解決方法也一定是加大記憶體。說說為什麼會記憶體益出:這一部分用於存放

Android避免記憶體溢位(Out of Memory)方法總結

避免記憶體溢位的方法,主要是對以下三個方面對程式進行優化 記憶體引用 在處理記憶體引用之前,我們先來複習下什麼是強引用、軟引用、弱引用、虛引用 強引用:強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。 當記憶體空間不足,Java虛擬機器寧願丟擲O

android studion 記憶體溢位GC

android studio 報錯    Error:Execution failed for task ':pen:dexDebug'.> com.android.ide.common.process.ProcessException: org.gradle.pro

Android開發Date型別處理

// strTime要轉換的string型別的時間,formatType要轉換的格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 // HH時mm分ss秒,

Android開發效能優化(記錄、自用)

雖然做Android開發已經有一段時間了,但是開發過程中經常是忙著實現功能,卻忽略了效能上的優化。以下都是來自於各位前輩的總結。特此總結記錄一下。  一、Android效能優化之佈局優化技巧 佈局優化就是用最少的view實現一樣的效果layout。最少的view也就是

tomcat記憶體溢位處理方法

tomcat記憶體溢位問題:     在JVM中如果98%的時間是用於GC且可用的 Heap size 不足2%的時候將丟擲此異常資訊。     JVM堆的設定是指java程式執行過程中JVM可以調配使用的記憶體空間的設定,     JVM在啟動的時候會自動設定Heap

Android開發中一些小記錄

1.有的時候,我們會從庫上check一些結構比較奇葩的工程,由於各種原因導致IDEA無法識別出版本同步工具是什麼,解決辦法,cd到.idea目錄下,在vcs.xml檔案中mapping節點的vcs屬性上配置上工具名稱Git即可(我用的是Git,所以我這裡就配置Git了),然後重啟IDEA就好了。

Android遇到記憶體溢位(Out Of Memory)BUG的經驗與解決方法

突然出現的Out Of Memory這個BUG導致我們專案中斷了好幾天,在經過不斷地摸索之後,今天終於得到了解決。鑑於其強大的破壞力與多發性(尤其是當開發圖形豐富的軟體時),在此將解決方法同大家分享,希望大家以後少走彎路,而本人水平有限,如有不當,還望指教! 那

Android開發之如何處理APP意外崩潰問題

public class CrashHandler implements UncaughtExceptionHandler { /** 獲取CrashHandler例項 */ public static CrashHandler getInstance() { if (INSTA

Android開發&異常及處理

Android開發中不免會遇到很多難題,主要分為幾種:開發工具無法工作(現多用AndroidStudio)、java原有異常、android特有的異常難點、其他。 一、AndroidStudio常見問題 1、Gradle版本錯誤 AndroidSt

android開發:如果處理,同樣的安卓應用程式在不同機器上,執行正常,但是與後臺伺服器互動響應時間不一樣的問題?

情景問題 專案中用到一個安卓應用程式,在不同的機器上,執行正常,與後臺伺服器互動響應時間不一樣,當是安卓應用程式在接受到請求,處理一下耗時操作,比如操作s qlite3,沒有即時反饋資訊給

android開發記憶體洩露分析

記憶體洩露分析: 在android開發的專案中,記憶體洩露是影響產品穩定性的最大誘因,目前總結到的記憶體洩露的2大源頭如下: 1.Bitmap記憶體未被釋放 Bitmap記憶體洩露是所有原因中最嚴重的一個,因為Bitmap物件引用的記憶體分JAVA層和C層,而GC機制在一

Android--圖片載入處理記憶體溢位和三級快取)

最簡單的解決辦法,用現成的框架,推薦glide和picasso用法:在build.gradle中加入:repositories { mavenCentral() maven { url 'https://maven.google.com' } } dependenc

淺談Android多圖(包括大圖)上傳時的記憶體處理,防止記憶體溢位

Android多圖上傳時,為了防止記憶體溢位,基本只要做好兩點就好了,一是及時釋放已經上傳完的圖片,以及在對圖片處理時,必須是一張一張來,因為對圖片的處理過程是最容易OOM的。 下面有簡單的程式碼說明下, 1、首先,圖片的model, ImageBean model中

Android Bitmap圖片處理,防止記憶體溢位

在android 中載入一張圖片,如果圖片過大就有可能會出現記憶體溢位,特別是在載入資料過多的時候,像ListView 和GridView等重複列表中,因此在處理Android圖片防止記憶體溢位就顯得特別的重要,也是很多面試中經常問到的問題,面試官通常都會讓你談