我想我的Android動態壁紙有內存泄漏。每當我旋轉屏幕時,收集的內存垃圾量增加50kb,並且不會回落。我認爲這可能是由於預定的未來造成的,所以我將介紹一個場景以查看是否屬於這種情況。預定的未來會導致內存泄漏嗎?
假設你有一個類(姑且稱之爲美孚),有以下成員。
private ScheduledFuture<?> future;
private final ScheduledExecutorService scheduler = Executors
.newSingleThreadScheduledExecutor();
private final Runnable runnable = new Runnable() {
public void run() {
// Do stuff
}
};
現在你設定一個計劃未來
future = scheduler.scheduleAtFixedRate(runnable, delay, speed,
TimeUnit.MILLISECONDS);
未來持有的可運行的引用,可運行保持父Foo對象的引用。我不確定情況是否如此,但是這意味着如果程序中沒有任何內容引用Foo,垃圾收集器仍然無法收集它,因爲有一個預定的未來?我並不擅長多線程,所以我不知道我所展示的代碼是否意味着計劃任務的壽命會長於對象,這意味着它不會最終被垃圾收集。
如果這種情況下不會導致富防止被垃圾收集,我只是需要被告知,有一個簡單的解釋。如果它確實阻止Foo被垃圾收集,那麼我該如何解決它?必須做future.cancel(true); future = null;
? future = null
部分是不必要的?
我的run方法不依賴於封閉Foo類。但是,在我銷燬對Foo對象的引用之前,我需要做些什麼來阻止可運行引發內存泄漏。 'future.cancel(真)'是否足夠?我已經這樣做了,內存泄漏仍然存在。當然,這可能意味着runnable不是泄漏的來源。 – gsingh2011
@ gsingh2011你確定'future.cancel(true)'取消了你的未來嗎?換句話說,你的runnable可以被中斷嗎?當它中斷時它會終止它的工作嗎? – assylias
因爲我不明白「你的runnable可以被中斷的意思是」我認爲它不能被打斷。我應該怎麼做? – gsingh2011