




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Memory Analysis 1Android內(nèi)存管理泄漏調(diào)試技巧 Java 層 Native 層 2Android內(nèi)存管理泄漏調(diào)試技巧 Java 層 強(qiáng)引用 即使虛擬內(nèi)存吃緊,也不會(huì)導(dǎo)致對(duì)象被回收。 弱引用 當(dāng)虛擬機(jī)OOM前,軟引用會(huì)被強(qiáng)制回收。 軟引用 虛引用 3Android內(nèi)存管理泄漏調(diào)試技巧 Android 每個(gè)應(yīng)用程序都會(huì)使用一個(gè)專門的 Dalvik虛擬機(jī)實(shí)例來運(yùn)行,它是由Zygote服 務(wù)進(jìn)程孵化出來的。一旦程序出現(xiàn)內(nèi)存泄 漏的問題,僅僅會(huì)使自己的進(jìn)程被kill掉, 不會(huì)影響其他進(jìn)程。 不同類型的進(jìn)程有不同的內(nèi)存使用上限。 init.rc 4Android內(nèi)存管理泄漏調(diào)試技巧
2、引起內(nèi)存泄漏的情況 查詢數(shù)據(jù)庫(kù)沒有關(guān)閉游標(biāo) Cursor cursor = null; try cursor = getContentResolver().query(uri .); if (cursor != null 5Android內(nèi)存管理泄漏調(diào)試技巧 構(gòu)造Adapter時(shí),沒有使用緩存的convertView。 public View getView(int position, View convertView, ViewGroup parent) View view = null; if (convertView != null) view = convertView; popula
3、te(view, getItem(position); . else view = new Xxx(.); . return view; 初始化時(shí)ListView會(huì)從BaseAdapter中根 據(jù)當(dāng)前屏幕布局實(shí)例化一些數(shù)量的 View,同時(shí)ListView會(huì)將這些view對(duì)象 緩存起來。當(dāng)向上滾動(dòng)Listview時(shí),原 先位于最上面的listview會(huì)被用來構(gòu)造 新出現(xiàn)的最下面的listItem。這個(gè)構(gòu)造 過程是由getView對(duì)象方法完成的。緩 存的數(shù)據(jù)放在convertView中。 因此,如果在getView中每次都不去使 用convertView重新實(shí)例化一個(gè)View對(duì) 象,即會(huì)導(dǎo)致內(nèi)存
4、泄漏。 6Android內(nèi)存管理泄漏調(diào)試技巧 Bitmap對(duì)象不在使用時(shí)需要調(diào)用recycle()釋 放內(nèi)存 由于Bitmap對(duì)象比較占用內(nèi)存,當(dāng)它不再被使 用的時(shí)候,可以調(diào)用Bitmap.recycle()方法回收 此對(duì)象。 7Android內(nèi)存管理泄漏調(diào)試技巧 引用導(dǎo)致的內(nèi)存泄漏 全局變量引用一個(gè)對(duì)象 public class DemoActivity extends Activity . private Handler mHandler = . private Object obj; public void operation() obj = initObj(); . mHandler.
5、post(new Runnable() public void run() useObj(obj); ); 由于obj是全局變量,因此當(dāng)mHander 即使使用完成后,由于DemoAcitivity還 在,所以initObj()的內(nèi)存并沒有被釋放。 可以將obj改為局部變量,然后再傳給 mHandler 8Android內(nèi)存管理泄漏調(diào)試技巧 應(yīng)用導(dǎo)致的內(nèi)存泄漏應(yīng)用導(dǎo)致的內(nèi)存泄漏 一個(gè)生命周期短的對(duì)象A,被一個(gè)生命周期長(zhǎng)的對(duì)象B引用。 例子:假設(shè)我們希望在鎖屏界面(LockScreen)中,監(jiān)聽系統(tǒng)中 的電話服務(wù)以獲取一些信息(如信號(hào)強(qiáng)度等),則可以在 LockScreen 中定義一個(gè)Phone
6、StateListener 的對(duì)象,同時(shí)將它注 冊(cè)到TelephonyManager 服務(wù)中。對(duì)于LockScreen 對(duì)象,當(dāng)需要 顯示鎖屏界面的時(shí)候就會(huì)創(chuàng)建一個(gè)LockScreen 對(duì)象,而當(dāng)鎖屏 界面消失的時(shí)候LockScreen 對(duì)象就會(huì)被釋放掉。 但是如果在釋放LockScreen 對(duì)象的時(shí)候忘記取消我們之前 注冊(cè)的PhoneStateListener 對(duì)象,則會(huì)導(dǎo)致LockScreen 無法被垃 圾回收。如果不斷的使鎖屏界面顯示和消失,則最終會(huì)由于大 量的LockScreen 對(duì)象沒有辦法被回收而引起OutOfMemory,使得 system_process 進(jìn)程掛掉。 9Andr
7、oid內(nèi)存管理泄漏調(diào)試技巧 分析步驟 以查詢光標(biāo)沒有關(guān)閉導(dǎo)致內(nèi)存泄漏為例 利用Heap,找到內(nèi)存泄漏的操作。(先要作GC) 10Android內(nèi)存管理泄漏調(diào)試技巧 分析步驟 使用Allocation Tracker對(duì)這一操作進(jìn)行跟蹤;重點(diǎn)查 看相同行中多次申請(qǐng)的操作,結(jié)合代碼分析。 11Android內(nèi)存管理泄漏調(diào)試技巧 Allocation Tracker工具只反映出了Allocation 的操作記錄。有可能顯示出來的對(duì)象其實(shí) 已經(jīng)釋放或者會(huì)被GC。 如果分析不出來,需要通過MAT工具進(jìn)行進(jìn) 一步的查找。 12Android內(nèi)存管理泄漏調(diào)試技巧 MAT(Memory Analyzer Too
8、l) 下載HPROF文件。 使用Eclipse Memory Analyzer工具打開。 如果無法打開需要使用Android自帶的hprof- conv.exe 工具進(jìn)行轉(zhuǎn)換。 抓取兩份hprof文件,操作一兩次,case gc 抓取第一份,重復(fù)多次有內(nèi)存泄漏的操作, case gc 抓取第二份。 13Android內(nèi)存管理泄漏調(diào)試技巧 使用Histogram比較這兩份文件的差異。 找到操作前后通過GC后增加的對(duì)象,斷定這些對(duì)象有內(nèi) 存泄漏的可能。 14Android內(nèi)存管理泄漏調(diào)試技巧 Shallow size就是對(duì)象本身占用內(nèi)存的大小,不 包含對(duì)其他對(duì)象的引用,也就是對(duì)象頭加成員 變量(不是成員變量的值)的總和。在32位系 統(tǒng)上,對(duì)象頭占用8字節(jié),int占用4字節(jié),不管 成員變量(對(duì)象或數(shù)組)是否引用了其他對(duì)象 (實(shí)例)或者賦值為null它始終占用4字節(jié)。 Retained size是該對(duì)象自己的shallow size,加上 從該對(duì)象能直接或間接訪問到對(duì)象的shallow size之和。換句話說,retained size是該對(duì)象被 GC之后所能回收到內(nèi)存的總和。 15Android內(nèi)存管理泄漏調(diào)試技巧 由于通過MAT找到了內(nèi)存泄漏的對(duì)象,但卻無 法確認(rèn)對(duì)象
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全縣輿情調(diào)研報(bào)告范文
- 清明實(shí)踐報(bào)告范文
- 2025年度木材代理進(jìn)口合同模板(含檢疫標(biāo)準(zhǔn))
- 2025年度足療養(yǎng)生館連鎖經(jīng)營(yíng)權(quán)及商標(biāo)轉(zhuǎn)讓合同書
- 二零二五年度學(xué)生安全保障與家長(zhǎng)責(zé)任書
- 2025年度電力安全監(jiān)督電力安裝工程勞務(wù)分包協(xié)議
- 二零二五年度智慧物流項(xiàng)目預(yù)算執(zhí)行書
- 二零二五年度手摩托線上線下銷售渠道合作合同
- 2025年度旅游咨詢兼職合同
- 檳榔品牌2025年度線上線下聯(lián)合代理協(xié)議
- (二調(diào))武漢市2025屆高中畢業(yè)生二月調(diào)研考試 地理試卷
- “艾梅乙”感染者消除醫(yī)療歧視制度-
- 2024-2025學(xué)年八年級(jí)地理下冊(cè)第七章《南方地區(qū)》檢測(cè)卷(人教版)
- 森林防火知識(shí)
- 2025年湖南鐵路科技職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)參考答案
- 2025年黑龍江林業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)帶答案
- 《ISO 56000-2025創(chuàng)新管理 基礎(chǔ)和術(shù)語(yǔ)》之1:“引言+范圍+術(shù)語(yǔ)和定義”專業(yè)深度解讀與應(yīng)用指導(dǎo)材料(雷澤佳編寫2025A0)-1-150
- DB37-T4817-2025 瀝青路面就地冷再生技術(shù)規(guī)范
- 2025年公共營(yíng)養(yǎng)師三級(jí)理論試題及答案
- 提高設(shè)備基礎(chǔ)預(yù)埋螺栓一次安裝合格率
- 煤礦防治水安全質(zhì)量標(biāo)準(zhǔn)化評(píng)分表
評(píng)論
0/150
提交評(píng)論