Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android內存分析工具

Android內存分析工具

編輯:Android開發教程

Dalvik 虛擬機支持垃圾收集,但是這不意味著你可以不用關心內存管理。你應該格外注意移動設備的內存使用,手機和平板 的內存空間是受到限制的。

在這篇文章裡面,我們來看看Android SDK裡面的一些內存剖析工具(profiling tools)是 如何幫助我們修整應用程序的內存使用。

一、 內存洩露

一些內存使用問題是很明顯的,例如,如果在每次用戶 觸摸屏幕的時候應用程序有內存洩露,將會有可能觸發OutOfMemoryError,最終程序崩潰。

另外一些問題卻很微妙,也 許只是降低應用程序和整個系統的性能(當高頻率和長時間地運行垃圾收集器的時候)。

二、 內存工具

Android SDK 提供了2個主要的剖析應用程序內存使用情況的工具:Allocation Tracker 和 heap dumps

1)Allocation Tracker 是很有用的,特別是當你想得到程序在一定的時間裡內存的分配情況的一種感性認識的時候。但是它不能給你任何關於程序heap 總體情況的任何 信息。關於Allocation Tracker的更多信息,請看文章Tracking Memory Allocations

2)heap dumps ,它是更強大的內存分析工具,一個heap dump就是一個程序heap的快照,它保存為一種叫做HPROF的二進制格式。Dalvik用的也 是類似的格式,但是不完全一樣,這裡是Java 的HPROF工具 。有很多方法去生成一個運行時應用程序的heap dump,其中一種就 是使用在DDMS裡邊的Dump HPROF file按鈕,如果想產生更精確的dump數據,可以在程序中使用 android.os.Debug.dumpHprofData() 方法。

分析heap dump,你可以使用一些標准的工具比如 jhat 或者Eclipse MAT( Memory Analyzer Tool) 。不過,首先需要把.hprof文件從Dalvik格式轉換成J2SE HPROF格式,你可以使用Android SDK提供的 hprof-conv工具。例如:

hprof-conv  dump.hprof  converted-dump.hprof

三、 內存調試

Dalvik 運行時裡,程序員不能顯式地分配和釋放內存,所以這裡的內存洩露跟C和C++裡面的不同。在你的代碼裡,內存 洩露就是你保留了一個並不再需要的類對象的引用,有時候僅僅一個引用就會阻礙gc對一大堆對象的回收。

我們來過一 個實際的例子,Android SDK裡面提供的范例程序Honeycomb Gallery sample app 。它是一個photo gallery程序,用來演示一 些新的Honeycomb API的使用。(下載和編譯這些代碼,請看這些 命令 )我們會有意地加入一個內存洩露在程序裡邊,然後來 演示如何調試它。

想象一下我們想修改程序讓它從網絡下載圖片,為了讓它更具備靈活性,我們可以考慮實現一個緩存 ,保存最近查看過的圖片,我們可以對ContentFragment.java做一些小的修改來達到這個目的。在class頂部,我們增加一個新 的靜態變量:

private static HashMap<String,Bitmap> sBitmapCache = new HashMap<String,Bitmap> ();

這裡是我們保存緩存的地方,現在可以修改updateContentAndRecycleBitmap()方法,讓它在下載之前先查看是否數 據已經存在,如果不存在就去下載,然後添加數據到緩存。

void updateContentAndRecycleBitmap (int category, 

int position) {     
    if (mCurrentActionMode != null) {     
        mCurrentActionMode.finish();     
    }     

    // Get the bitmap that needs to be drawn and update the ImageView.     

    // Check if the Bitmap is already in the cache     
    String bitmapId = "" + category + "." + position;     
    mBitmap = sBitmapCache.get(bitmapId);     

    if (mBitmap == null) {     
        // It's not in the cache, so load the Bitmap and add it to the cache.     
        // DANGER! We add items to this cache without ever  removing any.     
        mBitmap = Directory.getCategory(category).getEntry(position).getBitmap(getResources());     
        sBitmapCache.put(bitmapId, mBitmap);     
    }     

    ((ImageView) getView().findViewById(R.id.image)).setImageBitmap(mBitmap);     
}

在這裡故意引入了一個內存洩露的問題:我們把圖片加入了緩存但是從來沒有移除他們,在真實的應用裡,我們可以 會用某種方法來限制緩存的大小。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved