內(nèi)存優(yōu)化(一)淺談內(nèi)存優(yōu)化

本系列文章斤斧,主要是總結我對Android開發(fā)過程中內(nèi)存優(yōu)化的理解早抠,很多東西都是平常的習慣和一些細節(jié)問題,重在剖析優(yōu)化的原理撬讽,養(yǎng)成一種良好的代碼習慣蕊连。

概述

既然談優(yōu)化,就繞不開Android三個內(nèi)存相關的經(jīng)典問題:

  • OOM
  • 內(nèi)存泄漏
  • 頻繁GC卡頓

導致這三個問題的原因:

OOM

App在啟動時會從系統(tǒng)分配一個默認的堆內(nèi)存游昼,同時擁有一個堆內(nèi)存最大值(可以動態(tài)申請這個大懈什浴),這個Max Heap Size的大小烘豌,決定了軟件運行時可以申請的最大運行內(nèi)存载庭。App軟件內(nèi)存分配是個不斷創(chuàng)建和GC回收的過程,就像一個水池擁有注入和排出水的通道廊佩,當注入過快囚聚,排出不足時,水池滿了溢出标锄,Out of Memory顽铸,即我們常說的OOM。

內(nèi)存泄漏

當我們在代碼中創(chuàng)建對象料皇,會申請內(nèi)存空間谓松,同時包含一個對象的引用,當我們長時間不使用該引用時践剂,JVM GC操作時會根據(jù)這個引用去釋放內(nèi)存鬼譬。但是,對象的回收可能有點差錯逊脯,如果這個對象A被另一個線程B所引用优质,當我們不再使用A,可A卻處于B的hold狀態(tài)男窟,那么我們每次創(chuàng)建的A都得不到回收盆赤,這個時候就會發(fā)生內(nèi)存泄漏了贾富。

頻繁GC卡頓

上面說了歉眷,App的堆內(nèi)存有最大值牺六,是有限的,那么如果我們頻繁的創(chuàng)建汗捡,當運行內(nèi)存不斷上升淑际,為了維持App的運行,GC回收也會頻繁操作扇住,軟件運行資源有些春缕,必然導致卡頓問題。

JAVA的GC機制艘蹋,非常的復雜和精辟锄贼,不可一言概論之,在看過許多blog之后女阀,給出一點自己的總結宅荤。

簡述JVM GC

我們都知道Java語言非常的方便,不像C語言浸策,申請和釋放內(nèi)存都是自己操作冯键,java有虛擬機幫忙。Android 的每個應用程序都會使用一個專有的Dalvik虛擬機實例來運行庸汗,即使內(nèi)存泄漏也只是kill當前App.

Java虛擬機有一套完整的GC方案惫确,只是簡單理解的話就是,它維持著一個對象關系樹蚯舱,當開始GC操作時改化,它會從GC Roots開始掃描整個Object Tree,當發(fā)現(xiàn)某個無法從Tree中引用到的對象時枉昏,便將其回收陈肛。

GC Roots分類舉例:

  • Class類
  • Alive Thread
  • 線程stack上的對象,如方法或者局部變量
  • JNI活動對象
  • System Class Loader

Java中的引用關系

java中有四種對象引用關系凶掰,分別是:強引用StrongRefernce燥爷、軟引用SoftReference、弱引用WeakReference懦窘、虛引用PhantomReference前翎,這四種引用關系分別對應的效果:

StrongRefernce

通過new創(chuàng)建的對象,如Object obj = new Object();畅涂,強引用不會被垃圾回收器回收和銷毀港华,即是OOM,所以這也容易造成我們接下來會分析的《非靜態(tài)內(nèi)部類持有對象導致的內(nèi)存泄漏問題》

SoftReference

軟引用可以被垃圾回收器回收午衰,但它的生命周期要強于弱引用立宜,但GC回收發(fā)生時冒萄,只有在內(nèi)存空間不足時才會回收它

WeakReference

弱引用的生命周期短,可以被GC回收橙数,但GC回收發(fā)生時尊流,掃描到弱引用便會被垃圾回收和銷毀掉

PhantomReference

虛引用任何時候都可以被GC回收,它不會影響對象的垃圾回收機制灯帮,它只有一個構造函數(shù)崖技,因此只能配合ReferenceQueue一起使用,用于記錄對象回收的過程

    PhantomReference(T referent, ReferenceQueue<? super T> q)

關于ReferenceQueue

他的作用主要用于記錄引用是否被回收钟哥,除了強引用其他的引用方式得構造函數(shù)中都包含了ReferenceQueue參數(shù)迎献。當調(diào)用引用的get()方法返回null時,我們的對象不一定已經(jīng)回收掉了腻贰,可能正在進入回收流程中吁恍,而當對象被確認回收后,它的引用會被添加到ReferenceQueue中播演。

Felix obj = new Felix();
ReferenceQueue<Felix> rQueue = new ReferenceQueue<Felix>();
WeakReference<Felix> weakR = new WeakReference<Felix>(obj,rQueue);

總結

看完Android引用和回收機制冀瓦,我們對于代碼中內(nèi)存問題的原因也有一定認識,當時現(xiàn)實中內(nèi)存泄漏或者溢出的問題宾巍,總是不經(jīng)意間咕幻,在我之后一些列的文章中,會對不同場景的代碼問題進行分析和解決顶霞,一起來關注吧肄程!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市选浑,隨后出現(xiàn)的幾起案子蓝厌,更是在濱河造成了極大的恐慌,老刑警劉巖古徒,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拓提,死亡現(xiàn)場離奇詭異,居然都是意外死亡隧膘,警方通過查閱死者的電腦和手機代态,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疹吃,“玉大人蹦疑,你說我怎么就攤上這事∪唬” “怎么了歉摧?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我叁温,道長再悼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任膝但,我火速辦了婚禮冲九,結果婚禮上,老公的妹妹穿的比我還像新娘锰镀。我一直安慰自己娘侍,他們只是感情好咖刃,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布泳炉。 她就那樣靜靜地躺著,像睡著了一般嚎杨。 火紅的嫁衣襯著肌膚如雪花鹅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天枫浙,我揣著相機與錄音刨肃,去河邊找鬼。 笑死箩帚,一個胖子當著我的面吹牛真友,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紧帕,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼盔然,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了是嗜?” 一聲冷哼從身側(cè)響起愈案,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹅搪,沒想到半個月后站绪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡丽柿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年恢准,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甫题。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡馁筐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔睬,到底是詐尸還是另有隱情眯漩,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站赦抖,受9級特大地震影響舱卡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜队萤,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一轮锥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧要尔,春花似錦舍杜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至还惠,卻和暖如春饲握,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚕键。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工救欧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锣光。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓笆怠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親誊爹。 傳聞我的和親對象是個殘疾皇子蹬刷,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容