24

String intern()がどのように機能するかを説明する多くの原始的な例を見てきましたが、それから恩恵を受ける実際のユースケースはまだ見ていません。

私が夢見ることができる唯一の状況は、かなりの量の要求を受け取るWebサービスを持っていることです。それぞれの要求は、厳密なスキーマのために本質的に非常に似ています。この場合、リクエストフィールド名をintern()することで、メモリ消費を大幅に削減できます。

実稼働環境でintern()を使用して大成功を収めた例を誰かが提供できますか?たぶん、人気のあるオープンソース製品での例ですか?

編集:私は手動インターンを参照していますが、文字列リテラルなどの保証されたインターンではありません。

4

5 に答える 5

21

をはるかに超える、異なる値Nのみを取ることができる文字列がある場合、インターンは非常に有益です。これで、文字列をメモリに保存する代わりに、最大で.までしか保存できなくなります。KNKNK

たとえば、ID5桁で構成されるタイプがあるとします。10^5したがって、異なる値のみが存在する可能性があります。値への多くの参照/相互参照を持つ大きなドキュメントを解析しているとしIDます。このドキュメントに合計参照があるとしましょう10^9(明らかに、ドキュメントの他の部分でいくつかの参照が繰り返されています)。

したがってN = 10^9K = 10^5この場合。文字列をインターンしない場合は、文字10^9列をメモリに保存します。メモリには、それらの文字列がたくさんありますequals(鳩の巣原理によ​​る)。ドキュメントを解析しているときに取得しintern()た文字列を取得し、ドキュメントから読み取ったインターンされていない文字列への参照を保持しない場合(ガベージコレクションできるように)、文字列ID以上を保存する必要はありません。10^5メモリ内。

于 2010-08-18T09:54:08.277 に答える
1

完全な答えではありませんが、追加の考慮事項 (ここにあります):

したがって、この場合の主な利点は、内部化された文字列に==演算子を使用する方が [内部化されていない文字列に] メソッドを使用するよりもはるかに高速であることequals()です。intern()そのため、文字列を 1 回または 3 回以上比較する場合は、この方法を使用してください。

于 2010-08-18T09:07:18.873 に答える
1

文字通り何百万ものデータを一度に処理する生産システムがあり、その多くは文字列フィールドを持っていました。文字列をインターンする必要がありましたが、そうではなかったというバグがありました。バグを修正することで、非常にコストのかかる (少なくとも 6 桁、場合によっては 7 桁) サーバーのアップグレードを行う必要がなくなりました。

于 2010-08-18T09:11:41.967 に答える
1

インターンが有益な例として、次のような多数の文字列が含まれます。

  • 文字列は複数の GC サイクルに耐えられる可能性が高く、
  • ストリングの大部分の複数のコピーが存在する可能性があります。

典型的な例では、テキストをシンボル (単語、識別子、URI) に分割/解析してから、それらのシンボルを長期間有効なデータ構造に添付します。XML 処理、プログラミング言語のコンパイル、および RDF/OWL トリプル ストアは、インターンが有益である可能性が高いアプリケーションとして思い浮かびます。

しかし、特に上記の仮定が正しくないことが判明した場合は、インターンに問題がないわけではありません。

  • インターンされた文字列を保持するために使用されるプール データ構造は、余分なスペースを必要とします。
  • インターンは時間がかかりますし、
  • interning は、そもそも重複する文字列の作成を妨げません。

最後に、インターンは、トレースしてコピーする必要があるオブジェクトの数を増やし、処理する必要がある弱い参照の数を増やすことで、GC オーバーヘッドを増加させる可能性があります。このオーバーヘッドの増加は、効果的なインターンによる GC オーバーヘッドの減少とバランスを取る必要があります。

于 2010-08-18T10:36:33.667 に答える
0

サービス拒否攻撃を引き起こす可能性があるため (intern() された文字列は決して解放されないため)、ユーザー提供のデータに対して決して intern を使用しないでくださいユーザーが指定した文字列に対して検証を行うことができますが、その場合も、intern() に必要な作業のほとんどを行っています。

于 2010-08-18T09:28:00.163 に答える