編輯: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); }
在這裡故意引入了一個內存洩露的問題:我們把圖片加入了緩存但是從來沒有移除他們,在真實的應用裡,我們可以 會用某種方法來限制緩存的大小。
上周谷歌版Galaxy S4(GT-I9505)的Android 4.3 Jelly Bean刷機包流出,也讓我們初步了解了Android 4.3的一些新特性。那麼,An
Preferences之間可以定義依賴關系,在第一個例子中已有說明。對應定義了依賴關系的Preferences,依賴指向的 Preference可以稱為Parent p
Android SDK對應沒個定義在res目錄下的資源都會定義一個維一的資源ID。在編譯時會在gen目錄下生成 R.java , 資源ID的 格式為 R.[type].[
最近二維碼真是越來越火了,隨便電視上、網絡上、商場裡,到處都是二維碼。而內嵌二維碼掃描功能的 軟件也越來越多,QQ、微信、UC浏覽器等等應用都可以對著二維碼掃一掃,感覺我
Preferences之間可以定義依賴關系,在第一個例子中已有說明。對應