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);
将来は、実行可能への参照を保持し、かつ実行可能な親のFooオブジェクトへの参照を保持しています。これが当てはまるかどうかはわかりませんが、プログラムの中にFooへの参照がない場合、予定されている未来があるためガベージコレクタはまだ収集できません。私はマルチスレッド化にはあまり適していないので、私が示したコードが、スケジュールされたタスクがオブジェクトよりも長く生きることを意味しているかどうかはわかりません。つまり、ガベージコレクションに終わることはありません。
このシナリオでFooがガベージコレクションされないようにならない場合は、簡単な説明でそのことを伝える必要があります。 Fooがガベージコレクションされないようにしたら、どうすれば修正できますか? future.cancel(true); future = null;
をする必要がありますか? future = null
は不要ですか?
私の実行メソッドは、囲むFooクラスに依存します。しかし、Fooオブジェクトへの参照を破棄する前に、実行可能ファイルがメモリリークを引き起こさないようにするために、私は何をしなければなりません。 'future.cancel(true)'で十分でしょうか?私はすでにそれをやっているし、メモリリークはまだそこにある。もちろん、これは実行可能ファイルがリークの原因ではないことを意味する可能性があります。 – gsingh2011
@ gsingh2011 'future.cancel(true)'はあなたの未来をキャンセルすると確信していますか?言い換えると、あなたの実行可能ファイルは中断され、中断されたときにそのジョブを終了できますか? – assylias
私はあなたの実行可能ファイルが中断することができないことを理解できないので、私はそれが中断できないと仮定します。私はこれをどのようにするべきですか? – gsingh2011