0

こんにちは Java 開発者:

一連の文字を格納する組み込みクラスを探しています。次の基準を満たす必要があります。

  1. char 値を格納できます (byte 値だけでなく)
  2. 事前に割り当てられたサイズを超えた場合に、基になるデータ構造のサイズが自動的に大きくなるようにする追加メソッドがあります。
  3. 内容をクリアする方法があります (つまり、メモリを再利用します)。
  4. 特定のインデックスでエントリを読み取ることができます。

これらの要件の一部を満たすオプションをいくつか見つけましたが、すべてではありません。例えば:

  1. CharBuffer は 2 を満たしていません。
  2. StringBuffer は 3 を満たしていません。
  3. ByteArrayOutputStream は 1 を満たしていません。
  4. CharArrayWriter は 4 を満たしていません。

これらのクラスのいずれかのドキュメントを誤解していますか、それとも 4 つの基準すべてを満たすデータ構造を誰かが知っていますか?

編集:基準3により、GCへの空きメモリを意味するものではありません。

これらのバッファーのいくつかを繰り返し割り当ておよび割り当て解除する必要がある状況にあります。私の使用例では、これらのバッファーは最終的にかなり大きくなり (~ 100 KB)、そのようなバッファーを使用するスレッドがいくつかあります。

バッファーを作成して使用し、完了したら GC 処理することができることを認識しています。しかし、JVM (および物理マシン) メモリの大部分を絶えず割り当てたり割り当て解除したりしていると、JVM ガベージ コレクタの実行速度が非常に遅くなることがわかりました。バッファを一度割り当ててから再利用することで(C ++でできるように)メモリのマイクロ管理を開始すると、速度が向上することがわかりました(したがって、ガベージコレクションのトリガー頻度が低くなります)。

4

3 に答える 3

2

StringBuilder/StringBuffer は、delete(...)必要なことを行う必要があるため、3 つの罰金を満たす必要があります。または、単純に新しいインスタンスを作成し、古いインスタンスを GC にしないのはなぜでしょうか?

于 2013-08-20T22:32:28.217 に答える
2

StringBuffer はコンテンツを削除できます

buffer.delete(0, buffer.length());
于 2013-08-20T22:38:38.347 に答える
1

私が見つけた解決策: StringBuilder には .setLength(0) があり、これを使用してバッファを取得してコンテンツの再書き込みを開始できます。

(専用の .reset() メソッドがあればよかったのに。)

于 2013-08-22T05:46:49.623 に答える