我發現每次執行之後,MAT pluging告訴的兩個String對象時間這些代碼可以區分在Android 2.1確實android.media.SoundPool導致內存泄漏?
SoundPool soundPool = new SoundPool(10, 7, 0);
...
...
soundPool = null;
內存泄漏「機器人:unnamed_thread」被添加到該方法的堆。這是一個問題嗎?
我發現每次執行之後,MAT pluging告訴的兩個String對象時間這些代碼可以區分在Android 2.1確實android.media.SoundPool導致內存泄漏?
SoundPool soundPool = new SoundPool(10, 7, 0);
...
...
soundPool = null;
內存泄漏「機器人:unnamed_thread」被添加到該方法的堆。這是一個問題嗎?
我看到兩種可能性(可能有以及會更多)。
所有Java對象的第一個(很有可能)是正確的:僅僅因爲您將引用設置爲null
並不自動意味着它後面的對象將被垃圾收集。
如果一個SoundPool
對象本身包含對兩個線程對象的引用,那麼在需要空間之前,這三者中的任何一個都不會被GC化(儘管這取決於收集器的有效程度)。
第二個(不太可能)是Android可能足夠智能以緩存線程(或甚至是SoundPool
)對象,以防需要再次使用它們。如果對象創建比對象重新循環更昂貴,他們可能會將其作爲性能優化來完成。
在這種情況下,他們仍然會對緩存中某個對象的引用進行引用,並且他們不會被認爲有資格進行垃圾回收。
你嘗試運行soundPool.release()而不是soundPool = null嗎?
非常感謝。我在我的代碼中調用了System.gc(),但它並沒有幫助清理這些對象。這是否意味着第一個可能性是不可能的? – user421301 2010-08-16 10:22:54
我很確定'System.gc()'是一個用來做垃圾收集的_suggestion_:「調用這個方法表明Java虛擬機花費大量的時間來回收未使用的對象......」。所以我不會排除這種可能性。 – paxdiablo 2010-08-16 11:38:15