8

次のようなコードがある場合:

public Constructor(final Object o) {
    taskSystem.add(new CycleTask(15, 15, -1) {

        @Override
        public void execute() throws Throwable {
            //access o here every 15 cycles forever
        }
    });
}

ガベージコレクションはいつ行われますか?タスクが収集された場合にのみ、それとも最終的なものであるために永久にメモリに残りますか?

4

4 に答える 4

9

o 最終的かどうかに関係なく、到達できなくなったガベージコレクションが取得される可能性があります。明らかに、execute実行中であれば、アクセスする必要がある場合oは、GCを防止します。

実行が完了すると、への参照が(たとえばコレクションに)execute保存されていないと仮定すると、ガベージコレクションの準備ができているというフラグが立てられます。o

于 2012-05-31T21:45:32.240 に答える
5

匿名クラスインスタンスがガベージコレクションの対象になると、メソッドが呼び出されたときに参照されたオブジェクトを他に何も参照していない場合o、そのオブジェクトはガベージコレクションの対象になります。

ガベージコレクションを阻止する最終変数については特別なことは何もありません。

于 2012-05-31T21:45:54.707 に答える
3

「final」はGCに影響を与えません。オブジェクトが到達不能になると、オブジェクトは収集の対象になります。この場合、少なくとも3つの参照があり、そのうちの1つでそれを止めることができます。'final'パラメーター。メソッドが戻ると消えます。発信者の参照。匿名クラスインスタンスの最後の変数のコピー。

于 2012-05-31T21:47:00.653 に答える
2

finalキーワードと変数の有効期間の間に関係はありません。

これは、不要になったときにガベージコレクションされます。これはパラメーターであるため、メソッドのすぐ外で発生する可能性があります(外部に参照がない場合)。

キーワードは、関数の呼び出し後に参照をそれ以上変更することを禁止するためにコンパイラーに与えられたfinal単なる制約です。o

于 2012-05-31T21:45:16.583 に答える