2012-04-19 7 views
9

は、文字列定数プールで文字列プールのサイズが超過するとどうなりますか?彼らはスペースを最適化するために、ランタイムのインスタンスによって作成された参考文献の表から参照されているので、Javaでは

文字列リテラルは、ごみ収集、 ではありません。

文字列リテラルプールのサイズが超えている場合は、 文字列リテラルプールの各文字列には参照があるため、GCには適格ではないためです。 JVMでどのように処理されますか?

+2

定数プールの文字列は、もはや必要なくなりました(つまり、クラスをアンロードしたクラス)。 –

+0

文字列プールのサイズが* what *を超えている場合? – EJP

答えて

3

文字列リテラルは、不要になったときに収集できます。通常、クラスに多くのクラスをロードしようとすると到達する可能性のある他の制限があるため、クラスに表示される場合は問題ありません。最大パーマネントGen.

一般的に言えば、開発者は文字列リテラルプールを使いすぎず、代わりにデータベースやファイルを使用して大量のデータをロードすることができます。

システムのスペースを最適化するためにString.intern()を多用すると、問題が発生する可能性があります。 String.intern()は無料ではなく、大量(数百万)の文字列を追加するとますます高価になります。これがパフォーマンス上の問題であれば、開発者にとってはそれが当然のはっきりしているはずです。

10

JavaRanchには、実際のコード例の説明があります。

一般的な出力は、以下である:

  1. 列はString.intern()を使用して、実行時定数プールに追加される場合、それはは、それが使用されなくなった後に収集しないガベージすることができます。おそらく、文字列プールは追加された文字列へのソフト参照のみを保持するので、それらをガベージコレクトすることができます(String.intern()はネイティブメソッドなので)。
  2. 文字列がCOMPILE時定数の場合は、対応するクラスの定数プールに追加されます。したがって、クラスがアンロードされた後にのみガーベッジ・コレクションを行うことができます。

あなたの質問への答えは:あなたが原因文字列定数のOutOfMemoryErrorの取得することができますどのように唯一の方法は、コンパイル時に計算多くの文字列リテラルで、多くのクラスのをロードすることです。最終的にPermGen空間の最大サイズを超えることができます。しかし、これはクラスをメモリにロードするときに起こります(アプリケーションの起動、プロジェクトのWebServerへのデプロイ、新しいライブラリの動的ロードなど)

関連する問題