2012-12-12 65 views
0

我想知道如何解決Android上我的應用程序的高內存使用問題。我搜索了互聯網,發現DDMS插件對於爲我的應用程序獲取堆的內存轉儲很有用。然而這一直沒用。Android應用程序內存使用問題疑難解答

應用程序「Usage Timelines Free」顯示使用的內存爲94 MB,而DDMS堆轉儲顯示總共爲8.4 MB,可疑泄漏爲資源文件。

當我生成亞行轉儲(dumpsys meminfo中),我得到:

     Shared Private  Heap  Heap  Heap 

       Pss Dirty Dirty  Size Alloc  Free 

      ------ ------ ------ ------ ------ ------ 

    Native  20  8  20 54588 39431  1892 

    Dalvik  6732  9952  6396 10756 10028  728 

    Cursor  0  0  0       

    Ashmem  184  0  184       

Other dev 11462  1172 11384       

.so mmap  2467  2072  1156       

.jar mmap  0  0  0       

.apk mmap  48  0  0       

.ttf mmap  2  0  0       

.dex mmap  1037  0  0       

其他MMAP 41 16 32

Unknown 46352  292 46348       

    TOTAL 68345 13512 65520 65344 49459  2620 

我怎麼能知道這是什麼巨大的內存消耗後面。我的應用程序是一個永久運行的前臺監視器服務,有幾項每天訪問幾次的活動。

謝謝。

+0

http://ttlnews.blogspot.in/2010/01/attacking-memory-problems-on-android.html –

+0

我已經用這個... DDMS,並得到了堆內存轉儲。它只顯示8.4 MB正在使用! – black

回答

0

DDMS並得到堆內存轉儲。它只顯示8.4 MB正在使用!

然後,在完成垃圾回收(創建堆轉儲的淨效果)後,您只使用了8.4MB的堆空間。

請注意,如果您在Android 1.x/2.x上運行此操作,MAT不會報告位圖消耗的空間。始終嘗試從Android 3.0+設備或模擬器轉儲堆。

當我生成亞行轉儲(dumpsys meminfo中),我得到:

我的猜測是,你是一個Android的1.x/2.x版本的設備或模擬器上運行這一點,你有很多的位圖內存。嘗試在Android 3.0+環境中運行堆轉儲和其他測試。

另外,請記住,adb dumpsys meminfo不會執行完整的垃圾回收,而轉儲HPROF文件會執行此操作。 Android垃圾收集器經過優化,可最大限度地減少CPU利用率,因此不會嘗試執行完整的垃圾收集。因此,在運行時,堆通常會填充垃圾,GC引擎會根據需要回收垃圾。

您可能也希望閱讀Dianne Hackborn's essay on this subject

+0

對不起,我應該提到應用程序正在我的Galaxy Nexus(JB 4.2)上運行。這些結果是從那裏生成的。當你說很多位圖的時候,你的意思是很多位圖圖片嗎?我不。我有幾個標誌和一些小圖標。另外,這個「其他開發者」是什麼?當我打開活動時它會增加,但當我退出時它不會增加。 – black

+0

@Sebouh:那麼你的內存使用是完全合理的:Galaxy Nexus上的8MB是相當小的。 「當你說很多位圖圖片時,你的意思是很多位圖圖片嗎?」 - 不,我的意思是很多位圖內存。這可能是「很多位圖圖像」或「一些非常大的圖像」。 「另外,這個」其他開發者「是什麼?「 - 有些東西顯然是懶惰加載到你的進程中,但除此之外,我不知道。 – CommonsWare

+0

謝謝。那麼我不應該擔心這個時間線應用程序報告的94 MB?此外,」未知「內存是巨大的......任何想法是什麼? – black