2015-12-14 42 views
7

我很難找到可能的內存泄漏。 我有一個活動,在背景中做了一些繁重的工作。Android Studio如何啓動垃圾收集器,它是如何工作的?

執行一些任務後,該應用程序消耗的內存太多。它似乎沒有得到正確的清理。

這是在默認狀態下的活動:

enter image description here

如果我運行該活動是做任務,越來越多的內存分配。經過一番工作

活動: enter image description here

起初我以爲這一定是內存問題,導致GC無法正確釋放內存。據我所知,GC可以釋放內存,如果沒有引用留給對象。那是對的嗎?

既然說到這讓我困惑的部分:

如果我運行從Android Studio中的GC,內存進行適當的清理和我的活動永遠不會被關閉。在分配大量內存時,我只需要使用Android Studio GC。 enter image description here

這是一個我的意思是:

enter image description here

一般的問題是:

爲什麼就可以在Android工作室GC妥善清理內存,爲什麼不它與自動android GC正常工作?

我知道這是一個非常普遍的問題。我只想知道,如果有不同類型的垃圾收集或類似的東西。

也叫System.gc();不正確地清理內存。

附加信息:

Moto G的第二代

的Android 5.0.2。

+0

「有時,活動或應用程序關閉,我認爲這可能是由內存問題引起的。」如果應用程序因b/c而死亡,則內存不足,您將看到Logcat中可以清楚看到的內存不足異常。我的直覺是你的應用程序崩潰的另一個原因。嘗試通過logcat查看崩潰原因。 – Shmuel

+1

併發GC只進行部分收集,以避免引起明顯的暫停。顯式GC(如Studio觸發的GC)會執行完整的GC掃描。一些閱讀:https://source.android.com/devices/tech/dalvik/gc-debug.html – laalto

+0

@Shmuel有沒有例外。甚至沒有警告。 – FlanschiFox

回答

2

也許你可以嘗試在你的重處理代碼中的某個地方明確地調用System.gc();

+0

對不起,我忘了。我已經嘗試過這種方法,但它並不奏效。 – FlanschiFox

+0

如果確實存在內存泄漏,那麼調用System.gc()將無助於b/c內存仍將通過代碼中某處的引用保留。 – Shmuel

+0

@Shuel True,但是OP表示,當他按下android studio上的GC按鈕時,應用程序不會崩潰,我想這是對System.gc()進行調用,因此我的建議。 –

4

內存泄漏可能由於幾個原因而發生。一個常見的原因是未正確回收的位圖。其他內存泄漏種子將上下文保留在對象中。例如,您啓動一​​個異步任務並傳遞一個上下文,因爲您稍後需要它。當異步任務運行時,它會保持對上下文的引用,因此整個活動都在內存中。對於通常是片段或活動的父類的引用,匿名和內部類也是非常頻繁的。

我建議你使用庫泄漏金絲雀來發現內存泄漏,並使用Android工具來跟蹤分配情況,以便準確發現內存泄漏發生的位置。

+0

感謝您的回答。你提到了常見的原因,如何發生內存泄漏。基本上這一切都是因爲剩下的引用是正確的。但在我的情況下,Android Studio GC調用正在清理所有事情。所以如果有一些奇怪的參考文獻,GC應該無法正確清理它們? – FlanschiFox

+0

不完全。你可以退出一個活動,但仍然保持參考幾秒鐘。所以當你在幾秒鐘後運行GC時,它會清理那些內存。 我面臨的情況是,我從幾次活動中回來,並有內存溢出,因爲可能正在回收位圖並延遲GC釋放該內存,所以發生內存不足。 默認情況下,GC不會釋放內存(如果沒有必要)(它未達到允許的最大內存量)。它也可能是你的其他問題。 – jorgemf

+0

我很高興看到這個帖子,這是相當新的。你有@oberflansch找到了爲什麼Android工作室的GC工作更好的原因嗎?我正在研究應用程序拋出內存並且程序崩潰的相同情況。在我的應用程序中發現的一件事導致了內存問題,因爲我在資源中使用的所有PNG圖像都太大。我想知道爲什麼在活動關閉之後android並沒有GC本身,即使所有類中的引用實際上都是關閉的......每次創建新活動時,內存都會不斷增加,直到它死亡 –