Android內(nèi)存管理泄漏調(diào)試技巧課件_第1頁
Android內(nèi)存管理泄漏調(diào)試技巧課件_第2頁
Android內(nèi)存管理泄漏調(diào)試技巧課件_第3頁
Android內(nèi)存管理泄漏調(diào)試技巧課件_第4頁
Android內(nèi)存管理泄漏調(diào)試技巧課件_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、Memory Analysis 1Android內(nèi)存管理泄漏調(diào)試技巧 Java 層 Native 層 2Android內(nèi)存管理泄漏調(diào)試技巧 Java 層 強引用 即使虛擬內(nèi)存吃緊,也不會導致對象被回收。 弱引用 當虛擬機OOM前,軟引用會被強制回收。 軟引用 虛引用 3Android內(nèi)存管理泄漏調(diào)試技巧 Android 每個應用程序都會使用一個專門的 Dalvik虛擬機實例來運行,它是由Zygote服 務進程孵化出來的。一旦程序出現(xiàn)內(nèi)存泄 漏的問題,僅僅會使自己的進程被kill掉, 不會影響其他進程。 不同類型的進程有不同的內(nèi)存使用上限。 init.rc 4Android內(nèi)存管理泄漏調(diào)試技巧

2、引起內(nèi)存泄漏的情況 查詢數(shù)據(jù)庫沒有關閉游標 Cursor cursor = null; try cursor = getContentResolver().query(uri .); if (cursor != null 5Android內(nèi)存管理泄漏調(diào)試技巧 構造Adapter時,沒有使用緩存的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; 初始化時ListView會從BaseAdapter中根 據(jù)當前屏幕布局實例化一些數(shù)量的 View,同時ListView會將這些view對象 緩存起來。當向上滾動Listview時,原 先位于最上面的listview會被用來構造 新出現(xiàn)的最下面的listItem。這個構造 過程是由getView對象方法完成的。緩 存的數(shù)據(jù)放在convertView中。 因此,如果在getView中每次都不去使 用convertView重新實例化一個View對 象,即會導致內(nèi)存

4、泄漏。 6Android內(nèi)存管理泄漏調(diào)試技巧 Bitmap對象不在使用時需要調(diào)用recycle()釋 放內(nèi)存 由于Bitmap對象比較占用內(nèi)存,當它不再被使 用的時候,可以調(diào)用Bitmap.recycle()方法回收 此對象。 7Android內(nèi)存管理泄漏調(diào)試技巧 引用導致的內(nèi)存泄漏 全局變量引用一個對象 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是全局變量,因此當mHander 即使使用完成后,由于DemoAcitivity還 在,所以initObj()的內(nèi)存并沒有被釋放。 可以將obj改為局部變量,然后再傳給 mHandler 8Android內(nèi)存管理泄漏調(diào)試技巧 應用導致的內(nèi)存泄漏應用導致的內(nèi)存泄漏 一個生命周期短的對象A,被一個生命周期長的對象B引用。 例子:假設我們希望在鎖屏界面(LockScreen)中,監(jiān)聽系統(tǒng)中 的電話服務以獲取一些信息(如信號強度等),則可以在 LockScreen 中定義一個Phone

6、StateListener 的對象,同時將它注 冊到TelephonyManager 服務中。對于LockScreen 對象,當需要 顯示鎖屏界面的時候就會創(chuàng)建一個LockScreen 對象,而當鎖屏 界面消失的時候LockScreen 對象就會被釋放掉。 但是如果在釋放LockScreen 對象的時候忘記取消我們之前 注冊的PhoneStateListener 對象,則會導致LockScreen 無法被垃 圾回收。如果不斷的使鎖屏界面顯示和消失,則最終會由于大 量的LockScreen 對象沒有辦法被回收而引起OutOfMemory,使得 system_process 進程掛掉。 9Andr

7、oid內(nèi)存管理泄漏調(diào)試技巧 分析步驟 以查詢光標沒有關閉導致內(nèi)存泄漏為例 利用Heap,找到內(nèi)存泄漏的操作。(先要作GC) 10Android內(nèi)存管理泄漏調(diào)試技巧 分析步驟 使用Allocation Tracker對這一操作進行跟蹤;重點查 看相同行中多次申請的操作,結合代碼分析。 11Android內(nèi)存管理泄漏調(diào)試技巧 Allocation Tracker工具只反映出了Allocation 的操作記錄。有可能顯示出來的對象其實 已經(jīng)釋放或者會被GC。 如果分析不出來,需要通過MAT工具進行進 一步的查找。 12Android內(nèi)存管理泄漏調(diào)試技巧 MAT(Memory Analyzer Too

8、l) 下載HPROF文件。 使用Eclipse Memory Analyzer工具打開。 如果無法打開需要使用Android自帶的hprof- conv.exe 工具進行轉換。 抓取兩份hprof文件,操作一兩次,case gc 抓取第一份,重復多次有內(nèi)存泄漏的操作, case gc 抓取第二份。 13Android內(nèi)存管理泄漏調(diào)試技巧 使用Histogram比較這兩份文件的差異。 找到操作前后通過GC后增加的對象,斷定這些對象有內(nèi) 存泄漏的可能。 14Android內(nèi)存管理泄漏調(diào)試技巧 Shallow size就是對象本身占用內(nèi)存的大小,不 包含對其他對象的引用,也就是對象頭加成員 變量(不是成員變量的值)的總和。在32位系 統(tǒng)上,對象頭占用8字節(jié),int占用4字節(jié),不管 成員變量(對象或數(shù)組)是否引用了其他對象 (實例)或者賦值為null它始終占用4字節(jié)。 Retained size是該對象自己的shallow size,加上 從該對象能直接或間接訪問到對象的shallow size之和。換句話說,retained size是該對象被 GC之后所能回收到內(nèi)存的總和。 15Android內(nèi)存管理泄漏調(diào)試技巧 由于通過MAT找到了內(nèi)存泄漏的對象,但卻無 法確認對象

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論