2

文字列のインターンを完全に無効にすることはできますか? あまり参考にならないかもしれませんが、ただの感想です。たとえば、jvm のチューニング中に、perm gen のサイズを制御するときに役立つポイントが少なくとも 1 つあります。

たとえば、私が OSGI フレームワークを配布し、誰でも独自のバンドルをいくつでも追加でき、各バンドルの文字列インターンがチューニング パラメーターを完全に台無しにする可能性がある場合などです。(もちろん、特定の固定ディストリビューションでチューニングを行う必要があることはわかっていますが、それでも...)

何かご意見は!!

4

4 に答える 4

6

Permgen のサイズ/使用法は、最新の JVM では問題になりません。インターンされた文字列は、参照が残っていない場合にガベージ コレクターで使用できるようになります。

(いいえ、文字列リテラルのインターンを「オフ」にすることはできません)。

于 2011-04-15T05:28:14.550 に答える
1

コードで文字列リテラルを使用しないことで、ほとんどの文字列のインターンを無効にすることができます。代わりに char[] を使用して、それらから文字列を構築できます。例えば

String hi = new String(new char[] { 'h', 'i' }); // not interned.

あなたが言ったように、これはあなた自身の仕事を生み出すだけであり、事態を悪化させるだけです.

私がOSGIフレームワークを配布し、誰でも独自のバンドルをいくつでも追加でき、各バンドルの文字列インターニングがチューニングパラメーターを完全に台無しにする可能性がある場合

バンドルを追加する場合、より高い最大メモリ、perm gen サイズ、ダイレクト メモリ サイズ、異なる NewSize 比率、さらには異なる GC が必要になる可能性があります。これを防ぐ唯一の方法は、OSGi コンテナー内の他のモジュールを禁止することです。

または、単に、バンドルを追加する場合は、チューニング パラメータを変更する必要があるかもしれないと言うことができます。

于 2011-04-15T07:03:59.883 に答える
1

Oracle の Java 7 以降、インターン文字列プールは PerGen に保存されなくなりました。詳細はこちらhttp://java-performance.info/string-intern-in-java-6-7-8/

于 2013-12-13T19:57:06.147 に答える
0

Stringは final クラスであり、拡張できません。したがって、いいえ - Java で文字列をインターンする機能を削除することはできません。

于 2011-04-15T05:27:52.160 に答える