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
部品は不要ですか?