4

ウィキペディアで以下のサンプルコードを読んだときhttp://en.wikipedia.org/wiki/Weak_reference

import java.lang.ref.WeakReference;


    public class ReferenceTest {
            public static void main(String[] args) throws InterruptedException {

                WeakReference r = new WeakReference(new String("I'm here"));
                WeakReference sr = new WeakReference("I'm here");
                System.out.println("before gc: r=" + r.get() + ", static=" + sr.get());
                System.gc();
                Thread.sleep(100);

                // only r.get() becomes null
                System.out.println("after gc: r=" + r.get() + ", static=" + sr.get());

            }
    } 

gc の前の出力 : r=I'm here, static=I'm here gc の後: r=null, static=I'm here

gc の後の出力を理解できません。sr(WeakReference) によって文字列プール内の文字列に参照される文字列への強い参照です。

4

3 に答える 3

0

String は String を内部的にキャッシュするため、sr はガベージ コレクションされません。したがって、内部キャッシュにはまだ参照があるため、WeakRefence はガベージ コレクションされません。

sr の場合のように静的に構築された String がキャッシュに追加されます。new Stirng("...") を使用して構築された文字列オブジェクトはそうではありません。したがって、通常は new String("...") を使用しない方がよいでしょう。

于 2013-07-05T09:48:48.607 に答える
0

ここで最初のケースでは、new String("I'm here")so を使用して文字列のオブジェクトを作成すると、オブジェクトは常にヒープ上に作成されます。その後、呼び出すとSystem.gc();、そのオブジェクトはガベージ コレクションに直接使用できます。

2番目のケースでは、オブジェクトの参照として文字列を渡しています。したがって、ここでは、文字列がオブジェクトの参照に直接初期化されるため、文字列の新しいオブジェクトは作成されません。したがって、ガベージコレクションには使用できません。この文字列はそのままになるためでstring-pool

于 2013-07-05T09:55:07.420 に答える