2

String多くのオブジェクトとintern()それらを作成するプログラムを書いたとします。

String someString = param1 + param2;
someString.intern();

Stringこれは文字列の小さなセットには問題ありませんが、10 億の sを作成しようとするとどうなりますか? (それとも 10 億 * 10 億?) 私が知る限り、JVMはs のPermGen領域に一定のプールを維持しており、 PermGenはGC処理されません。String

ループ内に過剰な数のStringオブジェクトを作成し、それらへの参照を削除した場合、それらはGCされますか ( PermGenスペースが不足しますか)? はString重複することなくすべて一意です。

4

2 に答える 2

8

Java 6 では、PermGen を埋めることができ、クリーンアップされます。

Java 7 では、インターンされた文字列は PermGen ではなく、ヒープにあります。

Java 8 には PermGen はありません。

リテラル プールには定数のみが含まれます。新しい文字列を作成すると、それはリテラルではないため、そもそもプールに含まれません。

注: String リテラル ハッシュ マップはサイズ変更されません。通常、デフォルトでは約 10K 要素です。エントリを追加すると、リンクされたリストの配列に変わるため、ますます遅くなります。

于 2013-10-03T19:11:48.363 に答える
3

いいえ、あなたが示しているのはリテラル構文ではありません。

String myString = "a literal String";

リテラル構文になります。ただし、メソッドを使用して、すべての文字列が定数プールに配置されていることを確認できますString.intern()。過剰な量の文字列をインターンするとどうなるかを自分でテストできます。

于 2013-10-03T19:11:23.910 に答える