我的Android應用程序本質上是一個前臺服務。該應用程序的用戶界面方面用於設置和配置此前臺服務。前臺服務保留內存對象
當服務通過應用程序UI啓動時,它開始顯示內存使用量爲23mb。
當Android啓動服務時(例如啓動時),它開始顯示7mb的內存使用情況。如果應用程序UI已打開,則內存使用量將增加至23mb。
當在UI的MainActivity中調用onDestroy()時,關聯的繪圖和資源保留在附加到前臺服務的內存中,並且不會收集垃圾。
我可以通過在MainActivity的onDestroy()中調用System.exit(0)
來解決問題。然後Android以7mb重新啓動前臺服務。
另外,我可以使用Manifest中的android:process
標記分隔UI和服務元素。
雖然上述'解決方案'都沒有解決實際問題,但我希望能在您的幫助下做到這一點!
使用通過Eclipse的MAT工具,我可以看到,不同的對象保留在內存中,只有兩個顯著大小之中的:
Class Name | Shallow Heap | Retained Heap Percentage
class android.content.res.Resources @ 0x40ef7910 System Class| 40 | 8,475,664 | 68.71%
android.graphics.drawable.BitmapDrawable$BitmapState @ 0x411beb20| 40 | 1,127,720 | 9.14%
檢查到GC根的路徑沒有給出線索,爲什麼這些都留在記憶中,或者是對他們的引用。
我已經試驗了我正在使用的上下文MainActivity.this
和getApplicationContext()
並刪除了對靜態變量的引用,但我無法擺脫這些內存對象。
任何幫助將不勝感激。
編輯:路徑GC根不含弱引用:
Class Name | Shallow Heap | Retained Heap
class android.content.res.Resources @ 0x40ef7910 System Class| 40 | 8,475,664
Class Name | Shallow Heap Retained Heap
android.graphics.drawable.BitmapDrawable$BitmapState @ 0x411beb20| 40 | 1,127,720
Class Name | Shallow Heap | Retained Heap**
[224] java.lang.Object[510] @ 0x41843738| 2,056 | 8,466,904
mValues android.util.LongSparseArray @ 0x40f46b28| 24 | 8,471,024
sPreloadedDrawables class android.content.res.Resources @ 0x40ef7910 SystemClass| 40 | 8,475,664
Found 1 path. No more paths left - for both entries.
你可以發佈兩個對象的GC根的路徑,不包括弱引用嗎?另外,你是否試圖通過調用'system.gc()'強制回收位圖?雖然不建議這樣做,但您可以看到您的問題是引用被擱置還是GC沒有得到回收。 – wangyif2 2013-04-22 18:04:00
@ wangyif2 - 謝謝,我編輯了這篇文章。格式化抱歉。我已經嘗試過垃圾回收,但無論我多次調用它,它都不會被清除。它在幾小時之後仍然在記憶中。 – brandall 2013-04-22 18:12:23
任何解決方案呢?我有完全相同的問題。在我的情況下,如果我在調用system.exit(0)中銷燬活動時,前臺服務需要重啓重啓。所以,即使這不是我的選擇。 – 2014-12-11 20:14:40