1. 程式人生 > >Android效能優化(一)記憶體洩露優化(靜態變數、單例模式、屬性動畫)

Android效能優化(一)記憶體洩露優化(靜態變數、單例模式、屬性動畫)

記憶體洩露優化分為兩個方面,一方面是在開發過程中避免寫出有記憶體洩露的程式碼,另一方面是通過一些分析工具比如 MAT來找出潛在的記憶體洩露繼而解決。

一、靜態變數導致記憶體洩露。一般情況下靜態變數引用了或者內部持有Activity導致Activity無法銷燬會導致記憶體洩露。程式碼如下:



二、單例模式導致記憶體洩露

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

建立一個單例類AppManager,程式碼如下


在MainActivity中使用此單例,程式碼如下:


我們來分析一下,為什麼會記憶體洩漏呢?
AppManager appManager=AppManager.getInstance(this);
這句傳入的是Activity的Context,我們都知道,Activty是間接繼承於Context的,當這Activity退出時,Activity應該被回收, 但是單例中又持有它的引用,導致Activity回收失敗,造成記憶體洩漏。
為了以防誤傳Activity的Context , 我們可以修改一下單例的程式碼,如下:


這樣子修改,不管外面傳入什麼Context,最終都會使用Applicaton的Context,而我們單例的生命週期和應用的一樣長,這樣就防止了記憶體洩漏。


三、屬性動畫導致記憶體洩露

從 Android3.0開始,Google提供了屬性動畫,屬性動畫中有一類無限迴圈的動畫,如果在Activity中播放此類動畫且沒有在 onDestroy中去停止動畫,那麼動畫會一直播放下去,儘管已經無法在介面上看見動畫效果了,並且這個時候 Activity的 View會被動畫持有,而View又持有了Activty,最終Activity無法釋放。下面的動畫是無限動畫,會洩露當前的Activity,解決方法是在Activity的onDestroy中呼叫animator.cancel()來停止動畫。


相關推薦

Android效能優化記憶體洩露優化靜態變數模式屬性動畫

記憶體洩露優化分為兩個方面,一方面是在開發過程中避免寫出有記憶體洩露的程式碼,另一方面是通過一些分析工具比如 MAT來找出潛在的記憶體洩露繼而解決。 一、靜態變數導致記憶體洩露。一般情況下靜態變數引用

java的執行緒安全模式JVM記憶體結構等知識學習和整理

知其然,不知其所以然 !在技術的海洋裡,前路漫漫,我一直在迷失著自我。 歡迎訪問我的csdn部落格,我們一同成長! “不管做什麼,只要堅持下去就會看到不一樣!在路上,不卑不亢!” 在下面的題目來自於我要加的一個QQ群,然後要加這個QQ群

記憶體洩露優化過程

背景 專案目前存在使用久了或者重複開啟關閉某個頁面,記憶體會一直飆升,居高不下,頻繁發生GC。靜置一段時間後,情況有所改善,但是問題依舊明顯,如圖1-1、1-2。 圖1-1.操作時的記憶體使用情況 圖1-2.靜置時的記憶體使用情況 如上圖1-1,

Android設計模式 模式靜態內部類模式

DCL雖然在一定程度上解決了資源消耗、多餘的同步、現成安全問題,但是還是在某些情況下會出現失效問題。成為雙重檢查鎖定(DCL)失效。 建議使用如下程式碼: package demo; publ

JavaScript設計模式模式組合模式和外觀模式

單例模式是指在您要確保始終只建立一個物件例項時使用的設計模式。 在面向物件的經典程式語言中,建立單例模式背後的概念多少有點讓人難以理解,因為其中包含一個同時具有靜態及非靜態屬性和方法的類。 但本文主要討論 JavaScript,因此,由於 JavaScript 是一種不包含真正類的動態語言,因此 Java

設計模式學習總結2模式建造者模式原型模式

單例模式(Singleton Pattern) 這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 單例模式有以下三點注意: 1、單例類只能有一個例項。 2、單

設計模式模式命令模式

六:單例模式 單例模式確保一個類只有一個例項,並提供一個全域性訪問點。 意圖:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 主要解決:一個全域性使用的類頻繁地建立與銷燬。 何時使用:

2模式內部類的實現方式

package demo; /** * Created by sunyifeng on 17/10/19. */ public class MyObject { // 內部類 priva

1模式立即載入延時載入

A、餓漢模式 package demo; /** * Created by sunyifeng on 17/10/19. */ public class ObjectA { // 餓汗模式

關於設計模式模式工廠模式代理模式介面卡模式觀察者設計模式的理解

1):單例模式 package designMode.singleton; /** * 單例模式形成的原因: * * 構造器私有---> 外界無法例項化,就在類內部建立一個例項物件,用static修飾,可以用類名直接呼叫---> 但是,類的一般用法都講究

Java學習筆記註釋物件初始化過程模式

面向物件 9.幫助文件的製作 9.1註釋 - 原則: 1、註釋形式統一 在整個應用程式中,使用具有一致的標點和結構的樣式來構造註釋。如果在其它專案中發現它們的註釋規範與這份文件不同,按照這份規範寫程式碼,不要試圖在既成的規範系

【Unity3D基礎教程】給初學者看的Unity教程:在Unity中構建健壯的模式Singleton

該部落格中的程式碼均出自我的開源專案 : 迷你微信 為什麼需要單例模式 遊戲中需要單例有以下幾個原因: 我們需要在遊戲開始前和結束前做一些操作,比如網路的連結和斷開,資源的載入和解除安裝,我們一般會把這部分邏輯放在單例裡。 單例可以控制初始化和銷燬順序,而靜態變數和場景中的GameObject都無法控制

面試題模式兩種寫法

第一種形式:餓漢式單例 public class Singleton { private Singleton(){} private static Singleton i

android必備記錄筆記記憶體洩露和各種效能優化

該篇筆記來自於平時學習時,對各種學習資源的整合,如有冒犯敬請諒解,整理的不好,還望海涵指出錯誤 一、記憶體洩露 針對記憶體洩露我認為要知道下面三點: 第一:要弄清楚記憶體洩露與記憶體溢位的區別 第二:要弄清楚常規的記憶體分析方法,重點掌握Leakcanary的使用和原

android記錄筆記記憶體洩露和各種效能優化

該篇筆記來自於平時學習時,對各種學習資源的整合,如有冒犯敬請諒解,整理的不好,還望指出錯誤,主要用於查詢與記錄 一、記憶體洩露 針對記憶體洩露我認為要知道下面三點: 第一:要弄清楚記憶體洩露與記憶體溢位的區別 第二:要弄清楚常規的記憶體分析方法,重點掌握Leakcanary的使用

Android記憶體洩露利器hprof篇

set processName=com.sec.android.app.dialertab;android.process.acore;com.sec.android.provider.logsprovider

Android--利用Handler訊息轉發機制實現倒計時內含防止記憶體洩露處理

真正學會Handler必須要了解的相關概念 相關概念圖示: Message:儲存資訊的物件,被Handler線上程間轉發,實現執行緒間的通訊。 MessageQueue:以有序的方式排列的,等待處理的事件(Runnable或者Message)。

Android 效能監控系列原理篇

歡迎關注微信公眾號:BaronTalk,獲取更多精彩好文! 一. 前言 效能問題是導致 App 使用者流失的罪魁禍首之一,如果使用者在使用我們 App 的時候遇到諸如頁面卡頓、響應速度慢、發熱嚴重、流量電量消耗大等問題的時候,很可能就會解除安

Android產品研發二十四-->記憶體洩露場景與檢測

上一篇文章中本文我們講解了一個Android產品研發中可能會碰到的一個問題:如何在App中儲存靜態祕鑰以及保證其安全性。許多的移動app需要在app端儲存一些靜態字串常量,其可能是靜態祕鑰、第三方appId等。在儲存這些字串常量的時候就涉及到了如何保證祕鑰的

設計模式(一)單例模式 JVM類載入機制 JDK原始碼學習筆記——Enum列舉使用及原理 Java併發:雙重檢驗鎖定DCL Java併發:Java記憶體模型 Java併發:Java記憶體模型 Java併發:雙重檢驗鎖定DCL JDK原始碼學習筆記——Enum列舉使用及原理

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。 單例模式一般體現在類宣告中,單例的類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 適用場合: 需要頻繁的進行建立和銷燬的物件; 建立物