我认为我的 Android 动态壁纸存在内存泄漏。每当我旋转屏幕时,收集的内存垃圾量就会增加 50kb 并且不会减少。我认为这可能是由预定的未来引起的,所以我将提出一个场景来看看是否是这种情况。
假设您有一个具有以下成员的类(我们称之为 Foo)。
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);
future 持有对 runnable 的引用,runnable 持有对父 Foo 对象的引用。我不确定是否是这种情况,但这个事实是否意味着如果程序中没有任何内容包含对 Foo 的引用,那么垃圾收集器仍然无法收集它,因为有一个预定的未来?我不太擅长多线程,所以我不知道我显示的代码是否意味着计划任务的寿命会比对象长,这意味着它最终不会被垃圾收集。
如果这种情况不会导致阻止 Foo 被垃圾收集,我只需要通过一个简单的解释来告诉我。如果它确实阻止了 Foo 被垃圾收集,那么我该如何解决呢?一定要做future.cancel(true); future = null;
吗?该future = null
部分是不必要的吗?