Android內存優化之內存泄漏

內存泄漏

內存泄漏一般有以下幾種情況:單例、靜態變量、Handler、匿名內部類、資源使用未關閉

單例導致的內存泄漏

單例的情況主要是因為單例的生命周期比較長,如果引用的一些資源(比如Context、圖片等)沒有做特殊處理,就容易導致內存泄漏。具體的分析可以查看文章:Android 單例模式的正確姿勢

靜態變量導致的內存泄漏

靜態變量的生命周期同樣很長,如果引用了一些資源沒有及時釋放的話就會導致內存泄漏,比如Context、圖片的引用等。

引用圖片資源,這樣寫就要小心了。

private static LinkedHashMap<String, Bitmap> mapPool;
復制代碼

引用的是Context,比如Activity。

public class MyActivity extends AppCompatActivity {private static MyClass myClass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (myClass == null) {myClass = new MyClass(this);}}class MyClass {MyClass(Activity activity) {}}
}
復制代碼

Activity退出后myClass仍然持有Activity的引用導致Activity無法被回收。

Handler導致的內存泄漏

Handler導致的內存泄漏需要先充分理解Android的消息機制,其中跟內存泄漏有關的一個點就是消息Message會持有Handler引用,這樣的話如果消息隊列中有消息還沒有處理完的話,Handler就無法釋放,這個時候如果Handler里面還引用了Activity或是其他資源,那就會導致內存泄漏。

一種情況是Handler是內部類,由于內部類會默認引用外部類,這時候如果外部是Activity等,就可能造成內存泄漏

public class MainActivity extends AppCompatActivity {private static LinkedHashMap<String, Bitmap> mapPool;private class MyHandler extends Handler {@Overridepublic void handleMessage(Message message) {}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}
復制代碼

解決方式也簡單,就是將Handler定義為靜態內部類。當然如果Handler里面還顯示引用了Context或是View等資源,最好用弱引用。

匿名內部類

匿名內部類導致的內存泄漏原因是匿名內部類會默認引用外部類,如果外部類是Activity等資源型類的話就會導致內存泄漏。所以你看我們通過自動工具生成的一些類,比如我們用GsonFormat生成的實體Bean,內部類都是靜態的。

資源使用未關閉

資源使用未關閉這個比較好理解,常見的資源類型有廣播BraodcastReceiver、ContentObserver、File、數據庫游標Cursor、以及Stream和Bitmap。在使用這些資源時我們就需要注意在不使用的時候需要及時釋放這些資源。

系統bug導致的內存泄漏

這種情況不用檢測工具很難發現,比如LeakCanary。這里就記錄一個InputMethodManager導致的內存泄漏。具體情形和解決方法可以查看文章:Android InputMethodManager內存泄漏 解決方法總結

感謝塵封的落葉的提醒。


                    歡迎關注我的微信公眾號,和我一起每天進步一點點!
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450696.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cmd - 使用curl命令的注意點

前言 最近在cmd中使用curl命令來測試rest api&#xff0c;發現有不少問題&#xff0c;這里記錄一下。 在cmd中使用curl命令的注意事項 json不能由單引號包括起來json數據里的雙引號要用反斜杠\轉義json數據里不能帶有空格如果想要在json數據里使用空格則必須用雙引號將整個json…

指針常見定義

再給出常用的C變量的定義方式&#xff1a;a) 一個整型數&#xff08;An integer&#xff09; b) 一個指向整型數的指針&#xff08;A pointer to an integer&#xff09; c) 一個指向指針的的指針&#xff0c;它指向的指針是指向一個整型數&#xff08;A pointer to a pointer …

場景應用題目常見面試真題詳解

文章目錄1. 場景應用1.1 微信紅包相關問題1.2 秒殺系統相關問題1.3 掃碼登錄流程1.4 如何實現單點登錄&#xff1f;1.5 如何設計一個本地緩存&#xff1f;1. 場景應用 1.1 微信紅包相關問題 參考答案 概況&#xff1a;2014年微信紅包使用數據庫硬抗整個流量&#xff0c;2015…

后Kubernetes時代的微服務

\本文要點\\當前微服務架構依然是最流行的分布式系統架構風格。Kubernetes和云原生運動已大規模地重新定義了應用設計和開發中的一些方面。\\t在云原生平臺上&#xff0c;服務僅具備可觀測性是不夠的。更基本的先決條件是使用檢查健康、響應信號、聲明資源消耗等手段實現微服務…

Dynamics CRM On-Premise V9安裝手記

下載地址&#xff1a; https://download.microsoft.com/download/A/D/D/ADDD6898-4EFA-46FA-80B6-6FE9A3CDED63/CRM9.0-Server-CHS-amd64.exe 安裝支持Windows 2016 及SQL Server 2016 SP2以上版本 我想安裝了All in one的&#xff0c;就想著用最新的SQLServer 2017&#xff0c…

金山網絡CEO傅盛:簡約之美

摘要&#xff1a;金山網絡CEO傅盛帶來了主題為《簡約之美》的精彩演講。他表示由于時代的變遷&#xff0c;紅海的競爭&#xff0c;項目的需求等原因&#xff0c;若想項目取得成功&#xff0c;唯有簡單才是王道&#xff0c;唯有簡單定位才能深入人心。那么&#xff0c;如何做到簡…

zookeeper安裝和使用 windows環境

簡介 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ZooKeeper是一個分布式的&#xff0c;開放源碼的分布式應用程序協調服務&#xff0c;是Google的Chubby一個開源的實現&#xff0c;…

計算機網絡常見面試真題詳解

文章目錄1. 計算機網絡1.1 請介紹七層網絡體系結構。1.2 請介紹五層網絡體系結構。1.3 了解網絡編程協議嗎&#xff1f;客戶端發送給服務器的請求&#xff0c;怎么確定具體的協議&#xff1f;1.4 TCP、HTTP、FTP分別屬于哪一層&#xff1f;1.5 講一下TCP/IP協議。1.6 說一說你對…

2018.09.14python學習第四天part2

流程控制之while循環 1.什么是循環&#xff1f;&#xff08;what&#xff09; 循環是指重復做某一件事 2.為何要有循環&#xff1f;&#xff08;why&#xff09; 為了讓計算機能像人一樣重復去做某一件事 3.如何使用循環&#xff1f;&#xff08;how&#xff09; #語法一&#…

git操作指令合集

1.下載完git&#xff0c;需要輸入用戶名和郵箱 git config --global user.name "Your Name" git config --global user.email "emailexample.com" 注意git config命令的--global參數&#xff0c;用了這個參數&#xff0c;表示這臺電腦上所有的GIt倉庫都會使…

C++回調函數(callback)的使用

什么是回調函數(callback) 模塊A有一個函數foo&#xff0c;它向模塊B傳遞foo的地址&#xff0c;然后在B里面發生某種事件&#xff08;event&#xff09;時&#xff0c;通過從A里面傳遞過來的foo的地址調用foo&#xff0c;通知A發生了什么事情&#xff0c;讓A作出相應反應。 那么…

Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解釋

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、Transient Transient表示該屬性并非一個到數據庫表的字段的映射,ORM框架將忽略該屬性&#xff1b; 如果一個屬性并非數據庫表的字段…

可愛的rem

前端開發中&#xff0c;移動端的開發可以說是舉足輕重了&#xff0c;可是又面臨著不同設備尺寸和分辨率的尷尬點。今天[2018-09-16]臺風山竹登陸廣東&#xff0c;來勢洶洶&#xff0c;外出是不可能的了&#xff0c;那就宅著寫寫這篇小文章吧...原文請戳這里-談談rem單位 超長的…

kafka直連方式消費多個topic

一個消費者組可以消費多個topic&#xff0c;以前寫過一篇一個消費者消費一個topic的&#xff0c;這次的是一個消費者組通過直連方式消費多個topic,做了小測試&#xff0c;結果是正確的&#xff0c;通過查看zookeeper的客戶端&#xff0c;zookeeper記錄了偏移量 package day04 /…

100個經典的C語言算法

100個經典的C算法 C語言的學習要從基礎開始&#xff0c;這里是100個經典的算法 題目&#xff1a;古典問題&#xff1a;有一對兔子&#xff0c;從出生后第3個月起每個月都生一對兔子&#xff0c;小兔 子長到第三個月后每個月又生一對兔子&#xff0c;假如兔子都不死&#xff0c;…

MySQL常見面試題目詳解

文章目錄1. SQL1.1 介紹一下數據庫分頁1.2 介紹一下SQL中的聚合函數1.3 表跟表是怎么關聯的&#xff1f;1.4 說一說你對外連接的了解1.5 說一說數據庫的左連接和右連接1.6 SQL中怎么將行轉成列&#xff1f;1.7 談談你對SQL注入的理解1.8 將一張表的部分數據更新到另一張表&…

[轉]windows系統激活

原文鏈接主題&#xff1a;使用kms激活&#xff0c;可以直接使用命令來完成。 方法&#xff1a;在win10桌面狀態下&#xff0c;右擊windows徽標或按快捷鍵windowsx&#xff0c;點擊命令提示符&#xff08;管理員&#xff09; 用到的命令是slmgr&#xff0c;手動kms激活命令如下&…

jackson annotations注解詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 官方WIKI&#xff1a;https://github.com/FasterXML/jackson-databind/wiki jackson 1.x和2.x版本的注解是放置在不同的包下的 1.x是在…

JS-for的衍生對象

在js中一般使用方法&#xff1a; 1.常規的for(var i0;i<length;i) 2.for-in:for(var item in list) 3.for of 描述&#xff1a;對應于一個對象的每個屬性&#xff0c;或一個數組的每個元素&#xff0c;執行一個或多個語句。 語法&#xff1a;for (variable in [object | ar…

浮點數在計算機中存儲方式

C語言和C#語言中&#xff0c;對于浮點類型的數據采用單精度類型&#xff08;float&#xff09;和雙精度類型(double)來存儲&#xff0c;float數據占用32bit,double數據占用64bit,我們在聲明一個變量float f 2.25f的時候&#xff0c;是如何分配內存的呢&#xff1f;如果胡亂分配…