Может ли запланированное будущее вызвать утечку памяти?
Я думаю, что у меня есть утечка памяти в моих живых обоях Android. Всякий раз, когда я поворачиваю экран, объем собранного мусора в памяти увеличивается на 50 КБ и не уменьшается. Я думаю, что это может быть вызвано запланированным будущим, поэтому я собираюсь представить сценарий, чтобы увидеть, так ли это.
Допустим, у вас есть класс (назовем его 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);
Будущее содержит ссылку на runnable, а runnable содержит ссылку на родительский объект Foo. Я не уверен, что это так, но может ли это означать, что если в программе ничего не содержится ссылка на Foo, сборщик мусора все равно не сможет ее собрать, потому что есть запланированное будущее? Я не слишком хорош в многопоточности, поэтому я не знаю, означает ли то, что код, который я показал, означает, что запланированное задание будет жить дольше, чем объект, то есть не будет собирать мусор.
Если этот сценарий не приведет к тому, что Foo не будет собирать мусор, мне просто нужно сказать это с простым объяснением. Если это не позволяет Foo собирать мусор, то как мне это исправить? Должен сделатьfuture.cancel(true); future = null;
? Этоfuture = null
часть ненужная?