2013-03-01 23 views
2

我目前正在開展一項有幾項活動的Android應用程序。大多數時候,該應用程序工作正常,但不時發生Out of Memory Exception。 (通常當試圖加載大背景圖像的下一個活動)Android內存不足異常和暫停的活動

我找不到任何明顯的內存泄漏,所以我創建了一個堆轉儲發生異常時(如描述here),並試圖分析它與墊。 我之前沒有做過這樣的事情,所以我不確定我應該找什麼。我開始通過點擊較大字節的對象,第二個似乎是一個位圖屬於一個ImageButton

enter image description here

的GC根的路徑顯示我的com.android.internal.policy.impl.PhoneWindow例如:

enter image description here

的事情是,唯一ImageButton在我的整個應用程序在我啓動活動和開展活動和崩潰活性之間有至少2周以上的活動。

那麼,爲什麼這個圖像仍然在堆? ImageButton只是在使用android:src屬性的佈局xml文件中定義,沒有任何內容通過代碼完成。堆中的早期活動還有很多其他較小的對象。

我也寫了一個小HelloWorld應用程序,看看它的堆轉儲,看起來,android保持堆中以前的活動的對象。如果是這種情況,那麼Out of Memory Exception必須有一天被拋出,所以我想我的分析一定是錯誤的:/

回答

0

你可能想看看在developer's documentation管理的位圖。

特別是:只要存在引用,位圖就會保存在內存中。所以,如果你絕對不得不爲你的按鈕使用大的位圖(如你所描述的那樣),你可能會手動加載並在你的Activity消失後立即使用recycle做得更好。

+1

我現在正在回收大圖像並調用finish()以便不再需要的活動 - 沒有OOM異常可見:) – FahneImWind 2013-03-02 21:26:09

0

好吧,我剛剛發現this並意識到,停止的活動(及其對象)不會被銷燬,只要他們在後面的堆棧上。即使不活躍的人需要更多的記憶。 有了這些知識,很明顯爲什麼像ImageButton這些對象仍然在堆中。

我仍然需要找出釋放這些資源的最佳方法,但我想這很大程度上取決於應用程序本身,並且一般來說很難回答。