多くの人が String.intern() のパフォーマンス上の利点について語っていますが、実際には、パフォーマンスの低下がどのようなものになるかについてもっと興味があります。
私の主な懸念事項は次のとおりです。
- 検索コスト: intern() がインターン可能な文字列が定数プールに存在するかどうかを判断するのにかかる時間。そのコストは、そのプール内の文字列の数に応じてどのように増減しますか?
- 同期: 明らかに、定数プールは JVM 全体で共有されます。intern() が複数のスレッドから何度も呼び出されている場合、そのプールはどのように動作しますか? どのくらいのロックを実行しますか? パフォーマンスは競合によってどのように変化しますか?
私は現在、重複した文字列のためにメモリを使いすぎるという問題がある金融アプリケーションに取り組んでいるため、これらすべてのことを心配しています。一部の文字列は基本的に列挙値のように見え、限定された数の潜在的な値 (通貨名 (「USD」、「EUR」) など) しか持つことができず、100 万以上のコピーに存在します。この場合、String.intern() は非常に簡単に思えますが、通貨をどこかに保存するたびに intern() を呼び出すことによる同期のオーバーヘッドが心配です。
それに加えて、他のタイプの文字列には何百万もの異なる値が含まれる可能性がありますが、それぞれのコピーは数万に上ります (ISIN コードなど)。これらの場合、100 万個の文字列をインターンすると、基本的に intern() メソッドが遅くなり、アプリケーションが動かなくなるのではないかと心配しています。