Java Stringインターンシップとは何ですか? 質問する

Java Stringインターンシップとは何ですか? 質問する

Java の文字列インターンとは何ですか? いつ使用すべきですか? また、その理由は何ですか?

ベストアンサー1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern()

基本的に、一連の文字列に対して String.intern() を実行すると、同じ内容を持つすべての文字列が同じメモリを共有するようになります。したがって、「john」が 1000 回出現する名前のリストがある場合、インターンすることで、実際にメモリが割り当てられるのは 1 つの「john」のみになります。

これは、プログラムのメモリ要件を削減するのに役立ちます。ただし、キャッシュは JVM によって永続メモリ プールに保持されますが、通常、ヒープに比べてサイズが制限されるため、重複する値があま​​りない場合は intern を使用しないでください。


intern() 使用時のメモリ制約の詳細

一方では、内部化することで文字列の重複を削除できることは事実です。問題は、内部化された文字列が Permanent Generation に移動することです。Permanent Generation は、クラス、メソッド、その他の内部 JVM オブジェクトなどの非ユーザー オブジェクト用に予約されている JVM の領域です。この領域のサイズは制限されており、通常はヒープよりもはるかに小さくなります。文字列に対して intern() を呼び出すと、文字列がヒープから Permanent Generation に移動され、PermGen スペースが不足するリスクがあります。

- から:http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html


JDK 7 以降 (つまり HotSpot) では、何かが変わりました。

JDK 7 では、インターンされた文字列は Java ヒープの永続的な世代に割り当てられなくなり、アプリケーションによって作成された他のオブジェクトとともに、Java ヒープのメイン部分 (若い世代と古い世代と呼ばれる) に割り当てられるようになりました。この変更により、メインの Java ヒープ内に存在するデータが増え、永続的な世代内のデータが少なくなるため、ヒープ サイズの調整が必要になる場合があります。ほとんどのアプリケーションでは、この変更によるヒープ使用量の変化は比較的小さいですが、多数のクラスをロードしたり、String.intern() メソッドを頻繁に使用したりする大規模なアプリケーションでは、より大きな変化が見られます。

- からJava SE 7 の機能と拡張機能

更新: Java 7 以降では、インターン化された文字列はメイン ヒープ内に格納されます。http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#jdk7changes

おすすめ記事