2013-04-22 45 views
4

我的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.thisgetApplicationContext()並刪除了對靜態變量的引用,但我無法擺脫這些內存對象。

任何幫助將不勝感激。

編輯:路徑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. 
+0

你可以發佈兩個對象的GC根的路徑,不包括弱引用嗎?另外,你是否試圖通過調用'system.gc()'強制回收位圖?雖然不建議這樣做,但您可以看到您的問題是引用被擱置還是GC沒有得到回收。 – wangyif2 2013-04-22 18:04:00

+0

@ wangyif2 - 謝謝,我編輯了這篇文章。格式化抱歉。我已經嘗試過垃圾回收,但無論我多次調用它,它都不會被清除。它在幾小時之後仍然在記憶中。 – brandall 2013-04-22 18:12:23

+0

任何解決方案呢?我有完全相同的問題。在我的情況下,如果我在調用system.exit(0)中銷燬活動時,前臺服務需要重啓重啓。所以,即使這不是我的選擇。 – 2014-12-11 20:14:40

回答

0

我的Android應用程序本質上是一種前景的服務。該應用程序的用戶界面方面用於設置和配置此前臺服務。

這適用於極少數應用程序。

檢查gc根的路徑並沒有提示爲什麼這些內存仍然存在,或者是對它們持有引用的線索。

Resources一個,至少在每個Dalvik進程中,不能被刪除。最有可能的是BitmapDrawable$BitmapStateResources有關。

+0

「這適用於數量極少的應用程序」 - 我的應用程序在此實現中必然是獨一無二的。我已更新該帖子。格式化抱歉。它會給你任何線索嗎? – brandall 2013-04-22 18:14:43

+0

@andjav:「我的應用程序在這個實現中必然是唯一的」 - 如果你這樣說。 「它能給你任何線索嗎?」 - 我的答案仍然存在。 – CommonsWare 2013-04-22 18:24:00

+0

「資源之一,至少在每個Dalvik進程中,無法刪除,很可能是BitmapDrawable $ BitmapState與資源綁定」 - 您能解釋爲什麼調用System.exit(0)會刪除此內存使用情況儘管和我的應用程序繼續在7MB左右的內存使用徘徊?當你說「它不能被移除」時,它的各個方面,顯然可以......? – brandall 2013-04-22 18:28:45