內(nèi)存優(yōu)化:圖片定位

目標(biāo)

通常最占內(nèi)存的就是圖片搭幻,內(nèi)存優(yōu)化最優(yōu)先從圖片入手,排查下大內(nèi)存的圖片有哪些,是哪里產(chǎn)生的祟滴,是不是合理

定位

Android Studio → Dump Java Heap → 轉(zhuǎn)換格式 → 用MAT打開

打開 Histogram 并按 Shallow Heap 排序。查看各類型對(duì)象占用內(nèi)存情況歌溉,byte[] 遙遙領(lǐng)先垄懂,繼續(xù)看是什么對(duì)象產(chǎn)生的

去掉弱引用,查看GC Roots引用鏈

再按 Shallow Heap 排序痛垛,看到有12個(gè)占用內(nèi)存一模一樣的 byte[]草慧,大小是1048592字節(jié)=1M

我們看第一個(gè) byte[] 是什么,其余的同理

這個(gè)圖可以看出這個(gè) byte[] 其實(shí) Bitmap 的成員變量 mBuffer
這個(gè) bitmap 對(duì)象的所有成員變量都列在左側(cè)的 Attributes
對(duì)我們有用的信息是:這個(gè) bitmap 是512x512

繼續(xù)看這個(gè) bitmap 是被誰(shuí)持有的(定位我們自己的類)
這個(gè) bitmap 當(dāng)前有5個(gè)引用鏈匙头,但未必全都是GCRoots可達(dá)的漫谷,我們?nèi)サ舨豢蛇_(dá)的

看到只有3條引用鏈了,全部展開看看

看到有2條引用鏈都是Fresco的蹂析,肯定是圖片緩存相關(guān)的舔示,暫不關(guān)心

第三條引用鏈信息:

  1. RCDataChangeMonitor 成員變量 ArrayList mRCDataChangedListeners

  2. ArrayList 成員變量 Object[] array,長(zhǎng)度為12(數(shù)組長(zhǎng)度12电抚,并不代表每個(gè) index 都一定有值惕稻,末尾的可能尚未賦值,下文出現(xiàn)的數(shù)組也是如此)

  3. array 的第3個(gè)元素是 CardPageVideoManager

  4. CardPageVideoManager 成員變量 SimpleV2ListViewVideoScroller mVideoScroller

  5. SimpleV2ListViewVideoScroller 成員變量 PinnedSectionListView mScrollView

  6. PinnedSectionListView 成員變量 View[] mChildren蝙叛,長(zhǎng)度為12(項(xiàng)目里 PinnedSectionListView extends ListView extends ViewGroup)

  1. 第4個(gè)是 LinearLayout (大概率所有元素都是LinearLayout)

  2. LinearLayout 成員變量 View[] mChildren俺祠,長(zhǎng)度為12

  3. 第2個(gè)是 RelativeLayout

  4. RelativeLayout 成員變量 mBaselineView 是 **QiyiDraweeView **

在項(xiàng)目里,上面出現(xiàn)的類都是基礎(chǔ)類(有太多類在使用它們)甥温,無(wú)法得知是哪個(gè)具體的類

我們想知道是哪個(gè)頁(yè)面锻煌,哪個(gè)控件,什么時(shí)候產(chǎn)生的這個(gè) Bitmap

第一種方法:斷點(diǎn)

  1. QiyiDraweeView 里 setController() 的時(shí)候有設(shè)置回調(diào)監(jiān)聽 setControllerListener(listener)姻蚓,那么我們就在回調(diào) onFinalImageSet() 里設(shè)置斷點(diǎn)宋梧,并設(shè)置斷點(diǎn)條件 imageInfo.getWidth()==512 && imageInfo.getHeight()==512,當(dāng) Debug 停在這里的時(shí)候狰挡,我們就能拿到對(duì)應(yīng)的圖片 url
1)
  1. 復(fù)制這個(gè) url捂龄,在 setController() 的調(diào)用方法里設(shè)置斷點(diǎn),并設(shè)置斷點(diǎn)條件 uri.toString().equals(圖片url)
2)
  1. 當(dāng) Debug 停在此處加叁,終于看到了具體的業(yè)務(wù)類 GameAndAppCardModel倦沧,之后就可以針對(duì)性地查看
    GameAndAppCardModel 的布局信息以及代碼

可以在此處斷點(diǎn)查看這個(gè) QiyiDraweeView 的 width 和 height 是不是512x512,如果差距較大它匕,那肯定是不合理的

3)

第二種方法:繼續(xù)從 MAT 中挖掘信息

觀察 QiyiDraweeView 的 Attributes

比較有用的信息:

屬于 MainActivity展融,id=2131559271,measuredHeight 和 measuredWidth 都是155(猜測(cè)此處圖片加載是不合理的豫柬,控件是155x155告希,而加載的 Bitmap 是512x512扑浸,浪費(fèi)內(nèi)存,當(dāng)然以控件最終的 width 和 height 為準(zhǔn))

id 的16進(jìn)制寫法是 7f0d0367燕偶,查看 app\build\intermediates\symbols\debug\R.txt

這里我們可以得知這個(gè) QiyiDraweeView 的 id 名稱是 poster喝噪,那么可以搜索下整個(gè)項(xiàng)目

android:id="@+id/poster"

結(jié)果數(shù)太多,還是無(wú)法定位

我們看下 PinnedSectionListView指么,它引用鏈下的第一個(gè) View 很有可能是列表的 convertView酝惧,這里的話也就是 LinearLayout,找找看有沒有有用的信息

看到在 getView() 里 setTag() 設(shè)置的 GameAndAppCardModel.ViewHolder

原因

不合理的原因也很簡(jiǎn)單伯诬,就是布局里 ImageView 沒有指定寬高(固定多少 dp)晚唇,所以在 Fresco setResizeOptions() 的時(shí)候,獲取不到該控件的寬高(項(xiàng)目中使用 Universal-Image-Loader 也一樣有這樣的問題)姑廉。解決方法缺亮,見下篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桥言,隨后出現(xiàn)的幾起案子萌踱,更是在濱河造成了極大的恐慌,老刑警劉巖号阿,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件并鸵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扔涧,警方通過(guò)查閱死者的電腦和手機(jī)园担,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枯夜,“玉大人弯汰,你說(shuō)我怎么就攤上這事『ⅲ” “怎么了咏闪?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摔吏。 經(jīng)常有香客問我鸽嫂,道長(zhǎng),這世上最難降的妖魔是什么征讲? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任据某,我火速辦了婚禮,結(jié)果婚禮上诗箍,老公的妹妹穿的比我還像新娘癣籽。我一直安慰自己仅淑,他們只是感情好雪标,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布碌更。 她就那樣靜靜地躺著哺壶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桑逝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天俏让,我揣著相機(jī)與錄音楞遏,去河邊找鬼。 笑死首昔,一個(gè)胖子當(dāng)著我的面吹牛寡喝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勒奇,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼预鬓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赊颠?” 一聲冷哼從身側(cè)響起格二,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竣蹦,沒想到半個(gè)月后顶猜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痘括,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年长窄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纲菌。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挠日,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翰舌,到底是詐尸還是另有隱情嚣潜,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布灶芝,位于F島的核電站郑原,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏夜涕。R本人自食惡果不足惜犯犁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望女器。 院中可真熱鬧酸役,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至入桂,卻和暖如春奄薇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抗愁。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工馁蒂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜘腌。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓沫屡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撮珠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沮脖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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