android性能優化 掘金,Android性能優化之內存泄漏

內存泄漏:內存單元使用完成后未釋放,未回收。

理解強弱引用和gc垃圾回收機制后,會更好的理解內存泄漏問題。

在目前的Android項目中,內存泄漏是無法避免的,在編寫代碼時要是否產生了內存泄漏。內存泄露中要注意對象、變量等的回收時刻。

在內存泄露中,雖然存在gc回收機制,還是要搞明白,你聲明的東西是何時創建的,何時回收的。簡單來說,就是要知曉生命周期,了解越多這樣的知識,對你的代碼理解力就會有越多的提升。

一.static引發的內存泄漏:

在單例模式下,我們通常都會使用static修飾我們的對象,所以這里就要講一下static所修飾的內容的生命周期了。

static:強調一下static修飾的內容通常是不會被gc系統回收的,所以該內容就會一直存在在系統中,那么,static總是會有銷毀的時候吧:

Lifetime of a static variable: A static variable comes into existence when a class is loaded by the JVM and dies when the class is unloaded,if you create an android application and initialize a static variable, it will remain in the JVM until one of the following happens:

the class is unloaded

the JVM shuts down

the process dies

1.類被卸載的時刻。

2.JVM虛擬機關機的時刻。

3.進程被kill的時刻。

那么也就說static所修飾的內容和程序的生命周期是相關的。

接下來要說的東西就很好理解了:

1.單例模式的內存泄漏

一些單例模式中初始化時會傳入context;當你傳入Activity/Fragment的contenxt時;在該Activity/Fragment關閉,要被回收的時候,單例類還是會持有對Activity/Fragment的context引用,那么該Activity/Fragment就不會被回收,這樣就造成了內存的泄漏。所以最好的解決辦法是 傳入Application的context即可,Application就是程序,他的context就是程序的context,所以與static的生命周期相同。例:getApplicationContext()。

2.非靜態內部類創建靜態實例造成的內存泄漏

內部類的最好優勢就是默認會持有外部類的引用,而當你用這個非靜態內部類創建了一個靜態實例,那么麻煩來了,因為這個類并非靜態類,所以這個類是可以被回收的,但是靜態實例一值保持著對該非靜態類的引用,造成了非靜態內部類不能被回收,因為非靜態內部類是不能脫離所屬類而單獨存活的,那么也就導致了外部類不能被回收,內存泄漏就產生了。解決辦法當然是加上static,將非靜態內部類變成靜態內部類,靜態內部類不依賴外部類,他們擁有不同的生命周期。

1).單例模式的靜態內部類,這種寫法的單例模式是最推薦使用的單例模式(詳細可查看《Android源碼設計模式解析與實戰》)。

public class AppContext {

public static AppContext getInstance() {

return SingletonHolder.instance;

}

/**

* 靜態內部類的單例模式

*/

private static class SingletonHolder{

private static final AppContext instance = new AppContext();

}

}

復制代碼2).線程中的的內存泄漏

也可以歸到內部類的靜態使用。

線程的方式有Handler、AsyncTask、Thread等方式。

其中所有的線程方式在Activity中都是內部類的方式存在的,所以一般為了避免內存泄漏,都將這些線程實行靜態內部類的方法。在Activity被銷毀的時候,將線程關閉,清空線程中的任務。

所以一定要慎用static,在使用時要考慮到是否產生了內存泄漏。

二、資源未關閉產生的內存泄漏

這個就簡單了,在使用BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等后,要記得對資源進行手動回收,就避免了內存泄露。

有不對的地方歡迎大家指出來!

謝謝!!!

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

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

相關文章

clocks_per_sec 時間不正確_你該擁有的不只是護膚品,還有正確護膚時間表

同樣是護膚,為什么你的效果始終不如意?其實,不同的時間段,皮膚各司其職,都有著不同的“任務”和“狀態”。快跟芭姐一起了解一下這份《皮膚時間表》,看看如何讓護膚效果事半功倍吧!清潔是喚醒肌…

jdbc連接數據scanip_JDBC連接數據庫的四種方式:DriverManager,DataSource,DBCP,C3P0

方法1:使用java.sql.DriverManager類驅動管理器類,用于管理所有注冊的驅動程序。(注:DataSource 接口是 JDBC 2.0 API 中的新增內容,它提供了連接到數據源的另一種方法。使用 DataSource 對象是連接到數據源的首選方法。)常用的兩…

HTML下拉菜單怎么做成橫向,css導航條橫向帶下拉菜單

cssdiv導航下拉二級菜單豎排效果如何改為橫排?,在“下一站”有三個二級豎排菜單,如何能變為橫排?困擾了我一天了,讓二級菜單變成一行,只需要在豎排的效果上,讓二級菜單都浮動起來,這…

java移動端接口測試_使用java如何進行接口測試

關于接口測試, 我們之前介紹過很多方法了, 有postman, soapUI, Jmeter等, 他們各有優勢和劣勢, 今天和大家分享的是如何用java TestNG來實現接口測試.開始測試之前需要如下準備工作:1. IDE環境, Intellij 或者eclipse, 個人推薦使用Intellij.2. JKD1.8 以上3. Maven 環境 Maven…

html5折疊卡片,基于HTML5折疊卡片式下拉菜單代碼

基于HTML5折疊卡片式下拉菜單代碼。這是一款基于jQueryCSS3HTML5實現的下拉列表框特效代碼。效果圖如下:實現的代碼。hmtl代碼:愛編程愛編程 jQuery特效 CSS3特效 HTML5特效 音效下載 flash動畫js代碼:(function ($) {var cards $(.card-dro…

fastexcel讀取excel追加寫入sheet頁_python筆記52:python操作excel

主要內容:小目標:掌握excel模塊主要內容:excel相關模塊,openpyxl安裝使用如果看完這篇文章,你還是弄不明excel相關操作; 你來找我,我保證不打你,我給你發100的大紅包。1. excel相關操…

HTML音樂播放沒聲音,網頁沒有聲音但系統顯示有聲音怎么回事?如何解決?

網友提問:為什么網頁沒有聲音,除了迅雷高清在線影院的視頻有聲音和本已經下載的歌或視頻有聲音外,其他網頁都沒有聲音!就是網頁沒聲音,其他一切正常!網頁沒有聲音但系統顯示有聲音;網頁在線視頻…

html層次選擇器例題,詳解強大的jQuery選擇器之基本選擇器、層次選擇器

jQuery允許開發者使用從CSS1到CSS3幾乎所有的選擇器,以及jQuery獨創的高級而復雜的選擇器。另外還可以加入插件使其支持XPath選擇器,甚至開發者可以編寫屬于自己的選擇器(即選擇器插件,參考上篇:jQuery插件原來如此簡單——jQuery…

cesium 經緯度繪制點_炫酷大屏地圖自定義繪制(一)

現在數據中臺的概念炒的火熱,那在收集到數據后就要想辦法去設計大屏,可視化展現。往往大屏都會涉及到地理位置的顯示。對于常見的省市區,網上都已經提供了地理json數據,那對于需要定制化的我們要怎么處理呢?首先我們還…

關于python語言和人工智能下哪個說法不正確_“在資源管理器”窗口中,文件夾圖標左側有“...

【單選題】表示串行數據傳輸速率的指標為:___。【單選題】串行口工作在方式0時,其波特率:___。【簡答題】發布混合堿含量的測定三個錐形瓶的滴定終點顏色【簡答題】將自己做的三個錐形瓶的滴定終點顏色拍照發上來(三個瓶子并排擺在白色托盤中)【單選題】Guido van Rossum正式對…

html瞄點四大名著有圖片,四大名著手抄報圖片圖和文字資料

四大名著之【三國演義】羅貫中(1330年一1400年之間),名本,號湖海散人,明代通俗小說家。他的籍貫一說是太原(今山西),一說是錢塘(今浙江杭州),不可確考。據傳說,羅貫中曾充任過元末農民起義軍張士誠的幕客&a…

shell181網格劃分_ANSYS軟件中SHELL181單元參數詳解(1)

SHELL181單元說明SHELL181單元適合對薄的到具有一定厚度的殼體結構進行分析。它是一個4結點單元,每個結點具有6個自由度:x,y,z方向的位移自由度和繞X,Y,Z軸的轉動自由度。(如果應用了薄膜選項的話,那該單元則只有移動自由度了)。簡并三角形選…

怎樣查詢2021高考模擬成績,2021年高三一模二模三模哪個成績更接近高考成績,看看網友是怎么評論...

2021年高三一模二模三模哪個成績更接近高考成績雖然大多數人認為一模的成績最接近高考,基本定型了,但高考變幻莫測,成績很有可能發生變化,成績升降都是很難說的。高三一模之后成績也沒有定型,還有最后逆轉的機會。高考…

lisp 標記形心_標記-整理算法

定義該算法分為標記和整理兩個階段,標記階段會遍歷并標記活動對象,整理階段通過數次搜索堆來重新裝填活動對象,它們聚集到了堆的一端。lisp2算法forwarding指針表示活動對象的目標地址過程概要初始狀態標記結束后整理結束后整理階段偽代碼com…

js遍歷json數組給html td賦值,JS實現給json數組動態賦值的方法示例

關注微信公眾號JS實現給json數組動態賦值的方法示例轉載 更新時間:2017年07月04日 10:19:00 作者:小魏的馬仔這篇文章主要介紹了JS實現給json數組動態賦值的方法,結合實例形式分析了javascript針對json數組的遍歷、賦值等常用操作技巧,需要的朋友可以…

甘肅民族師范學院計算機科學系,甘肅民族師范學院計算機科學與技術專業2016年在甘肅理科高考錄取最低分數線...

類似問題答案衡陽師范學院計算機科學與技術專業2016年在甘肅理科高考錄取最低分數線學校 地 區 專業 年份 批次 類型 分數 衡陽師范學院 甘肅 計算機科學與技術 2016 二批 理科 448 學校 地 區 專業 年份 批次 類型 分數 衡陽師范學院 甘肅 計算機科學與技術 2016 二批 理科 44…

python面試題百度云下載_分享三道Python經典面試題

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓驗證郵箱格式驗證郵箱的格式,不同語言的實現大同小異,通過正則表達式是最快捷的匹配方式,但對于不熟悉正則的同學看著一長串匹配符還是比較頭痛的,其實也沒那么恐怖。熟悉python 中正…

計算機科學與技術專業實習招聘,中科院研究生院招聘GIS或計算機專業實習生

中科院研究生院招聘GIS或計算機專業實習生由于項目需要,中科院研究生院特招聘GIS或計算機方向實習生,具體要求如下:項目名稱:油氣田WebGIS系統招聘人數:1人(目前已有1人)主要工作是根據油氣田生產需要,實現WebGIS支持下…

r語言regexpr函數_R語言學習筆記-文本挖掘之字符處理(1)

在挖掘分析的過程當中對字符串的處理是極為重要的,且出現也較為頻繁,R語言作為當前最為流行的開源數據分析和可視化平臺,雖然文本的處理并不是它的強項, 但是R語言還是包含大量的字符串操作工具,本章著重整理了部分常用字符處理函…

html div如何列對其,CSS:自適應N列布局如何解決兩端對齊

關于每行N列的這種布局,存在一個兩端對齊的問題,因為每一列都會存在一個margin-left或者margin-right,導致最后一個超出父元素的邊界。通過一番努力,終于解決了這個遺留很久的問題,廢話不多說,先看做完之后…