2012-11-23 92 views
4

我們可以在Elipse內存分析工具(在DDMS視圖中)看到的堆使用情況(分配)和Android設備上顯示的同一應用的內存使用情況大小之間有什麼區別? :Android正在運行的應用程序內存使用情況

設置 - >應用 - >運行

即使我積極地試圖通過使物體空,只要是沒有必要,他們,​​後者的數量(內存使用量的大小來保存記憶在運行應用程序屏幕上)只會不斷增加,並且由於OutOfMemoryE,我的應用程序最終崩潰RROR。然而,前者表明我的身材合理。我也調用了很多System.gc()。兩者有什麼不同?爲何差異?關於如何解決這個問題的任何想法?

+0

在其Android版本,你在這個測試?你在使用位圖嗎? –

+0

我正在從事ICS工作,但儘量保持向後兼容性。是的,我正在使用Bitmaps,這是我的恐懼 - 當活動退出時,是不是應該清除這些內容?顯式GC後如何?如果不是,我應該手動執行此操作嗎?怎麼樣?無論如何,我正在使用的位圖不是大文件 - 它們在演繹後大小是否增加? –

回答

2

我知道的兩者之間最大的區別是垃圾收集的範圍。

正常垃圾收集,包括System.gc(),收集一些垃圾,然後停止。它不是完全擺脫一切的堆。這是爲了儘量減少垃圾收集對CPU的影響。

爲MAT準備的堆轉儲實際上是一個完整的GC。

您的症狀表明您分配內存的速度比GC可以回收的速度快。對此的主要解決方案是嘗試分配較少的內存,或者分配較少的內存。例如,在可能的情況下,重用對象,位圖緩衝區等,而不是試圖讓GC清理舊東西,並隨時分配新東西。

+0

實際上,更具體地說,我有一些我主要使用的活動(類)成員對象,並且這些應該在方法返回後立即生效,對吧?但它並非完全如此 - 即使我另外讓它們爲空,內存也只是在增加。 –

+0

@DivyanshGoenka:「我有一些我主要使用的活動(類)成員對象,一旦他的方法返回,這些對象應該被GCed,對吧?」 - 一旦活動被破壞,活動的非靜態數據成員就有資格獲得GC。我不知道「一旦他的方法返回」是什麼意思。 – CommonsWare

+0

對不起,只是一個錯字。我的意思是我通常會盡可能地限制我的成員的範圍,以便他們能夠更快速地工作。當這種情況沒有發生時,我甚至開始在範圍的末尾使它們變爲空,認爲這可能有幫助。但是,情況並非如此。我在我的問題中描述的兩個數字之間存在巨大差異。有可能(雖然我不這麼認爲)明確的GC實際上是在破壞它嗎?有沒有什麼辦法像你明確說的那樣得到完整的掃描? –

0

這聽起來像你有一個內存泄漏在你的應用程序的某個地方,如果內存從來沒有釋放。這意味着在某個地方你正在維護一個正在被重新創建的大對象的強引用(就像Activity或Bitmap),這就是爲什麼調用System.gc()沒有任何區別。

我建議看從谷歌IO 2011年它可以讓你知道如何使用Eclipse的內存分析工具,它是用於調試這種錯誤的非常有用的memory management in android以下

+0

感謝您的迴應,這個視頻已經非常有用! –

相關問題