2011-11-16 6 views
0

文字列オブジェクトプールがPermGCに存在し、文字列インターンが実行されると、まずプールをチェックして、同等の文字列オブジェクトが存在するかどうかを確認し、存在しない場合は作成しますプールされたインスタンスへの参照を返します。PermGCの文字列オブジェクトプールについて

しかし、ここに私の最初の質問があります。

オブジェクトはヒープ上、特に若い世代が最初に作成されると思います。少数のガベージコレクションの間に生き残れば、古い世代に移動します。どのように文字列オブジェクトがPerm GCに存在するプールに移動するのか誰にも説明できますか?

2番目の質問:

のString = "テスト"。 s = "test1";

「test1」を参照に再割り当てして「test1」を引き続き使用すると、若い世代で作成された「テスト」がガベージコレクションされることになりますか?

第3質問: 文字列オブジェクトプールはどのようにランタイム定数プールに関連していますか?

ありがとうございました。

答えて

2

あなたは、interned Stringが最初に若い世代に行くと思いますか? String#intern()メソッドは、ネイティブメソッドです。実装がパーマネントの中に直接移動することは確かに可能です。

2番目の質問:その"test"文字列インスタンスへの参照が他にない場合は、ガベージコレクションの対象です。拘束されていれば同じ話。もはやアクティブな参照を持たない内部文字列でさえ、ガベージコレクションされる可能性があります。しかしこれは古いJVMではそうではないかもしれません。そしてそれは実装固有のものであると思います。

3番目の質問についてはわかりません。私が知っているのは、ソースコードの文字列リテラルが同じプールに配置されていることだけです。 sourceからString定数に等しいStringを作成し、それをインターンすると、定数を表すために使用されたインスタンスが返されます。すぐに拘束された文字列リテラルと考えてください。

EDIT:最初の数文をもう一度読んでください。混乱の理由がわかります。文字列にintern()を呼び出すと、同じ文字列がまだプールに存在しない場合は、最初に同等のStringを作成することはありません。新しい参照を返すのではなく、intern()というインスタンスをプールに移動するだけです。 That's how it's stated in the JavaDoc

+0

あなたは、文字列s = new String( "test")のみと言っていますか?若い世代に最初に文字列オブジェクトを作成しますか? – user826323

+0

@ user826323それは、若い世代のオブジェクトになります。そして、 'intern()'を呼び出すと、そのインスタンス 's'は、同等のStringがまだ存在しない場合、permgenプールに入れられます。**または**以前にプールされたインスタンスが返されます。 2つの参考資料を残す。しかし、 'String s =" test ";'が ''コード内にあれば、それはソースコードリテラルなので効果的に '' test ''をプールに入れます。 –

0

文字列は2つのケースでインターンプールに行く:

  • 明示的
  • あなたは(あなたが文字列の明示的な内容を与える)リテラルで初期化Stringオブジェクトのインターン()メソッドを呼び出し、 Javaは自動的にStringリテラルをインターナショナルにします。

プールはテーブルとして編成されます。一度Stringが格納されると、値がまだ存在しない場合はプールに追加されます。それ以外の場合は、既存のエントリへの参照が使用されます。

あなたのケースの "test"は、プールに行くべきであり、若いスペースではなく、もはや参照されないStringsのクリーンアップもそこで実行されます(同じGCプロセスの一部であるとは言えません)。ヒープまたはこの動作が標準である場合)

関連する問題