Я думаю, что у меня есть утечка памяти на моих живых обоях 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
?