2013-08-09 13 views
7

javaの文字列内部を調べた後、私は "パーマスペース"と呼ばれるものについて混乱しました。当初の私の理解は、Stringリテラルと、this questionで説明されているようなクラスのメタデータを保持していたということでした。内部文字列、文字列プール、およびパーマネントスペースのガベージコレクション

私はString.intern()メソッドについても読んでおり、Stringを文字列プールに配置して、その一意のインスタンスへの参照を返します。これは、JVMのパーマネントスペースに存在する文字列リテラルを保持するのと同じ文字列プールであると私は理解しています。 「パーマスペース」が変更可能であるとは思われませんでした(それは結局永久的です、はい?)。しかし、その後、私が見つけたトップが受け入れ答えにEJPによってコメントを投票this question

Intern'd文字列は、現在かなりの数年のためにGC-ことができたと説明しています。

GCが非常に永久的に見えないパーマスペースで動作することを意味します。これはどうやって調和するのですか? GCはパーマスペースのすべてをチェックしますか? GCはソースからの文字列リテラルを含む文字列プール内のすべてをチェックしますか?インターナショナルな文字列のための2番目の文字列プールがありますか? GCは、収集する際にインターナショナル・ストリングを見渡すだけのことを知っていますか?あるいは、このコメントが間違っていて、文字列をインターナショナルにすることで、GC'dができなくなってしまいます(私はそうではないと思います)?

答えて

7

文字列リテラルare internedJava 7の時点で、HotSpot JVMは、permgenではなく、ヒープ内にインターネットされたStringを配置します。

java 7より前のバージョンでは、hotspotはinterned文字列をpermgenに入れました。しかしながら、interned Strings in permgen were garbage collected。明らかに、Class objects in permgen are also collectableなので、permgen内のすべてが収集可能ですが、古いJVMではpermgenコレクションがデフォルトで有効になっていない可能性があります。

インターンされている文字列リテラルは、宣言しているクラスオブジェクトがインラインプールのStringオブジェクトに保持する参照になります。したがって、内部のリテラルStringは、参照されたClassオブジェクトも収集された場合にのみ収集されます。

関連する問題