3

弱参照について勉強していました。そして、OutOfMemoryError が発生する前に、すべての弱い参照がガベージ コレクションされることを理解しました。私はこのような簡単なテストをしました(OOMEをキャッチするのは良くないことは知っていますが、単なるテストです):

Integer weakInt = new Integer(10);
WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt);

try {
    while (weakReference != null) {
        String[] generateOutOfMemoryStr = new String[999999999];
    }
}
catch (OutOfMemoryError oome) {
   System.out.println(weakReference.get());
}

弱い参照が収集されている必要があるため、null が出力されることを期待していましたが、常に 10 の出力が得られます。

どこが間違っているのか教えてください。弱い参照の概念が間違っていると理解できましたか?

4

1 に答える 1

10

weakReferenceそれ自体は null になりません...どうすればよいでしょうか? ただし、そのターゲットは null になる可能性があります。

私はあなたが意味すると思います:

while (weakReference.get() != null) {

さらに、weakIntそれ自体を null に設定しない限り、そのローカル変数によってIntegerオブジェクトがガベージ コレクションされるのを防ぐことができると思います。

さらに、ループがまだ終了しないことに気付くと思います-ガベージコレクションされてInteger いる場合でも、割り当てられるよりも多くのメモリを要求している可能性が非常に高いためです。

少なくとも私のボックスで、それが機能することを示すプログラムを次に示します。

import java.lang.ref.*;

public class Test {
    public static void main(String[] args) {
        Integer weakInt = new Integer(10);
        WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt);

        weakInt = null;
        while (weakReference.get() != null) {
            System.out.println("Looping...");
            String[] generateOutOfMemoryStr = new String[999999];
        }
        System.out.println("Weak reference collected");
    }
}
于 2011-06-05T19:17:39.027 に答える