BodyContentImpl の非効率性と cb スペースの割り当て方法について、apache でいくつかのバグ レポートを読みました。( private char[] cb;
) タグが 50KB の HTML を書き出す場合、バッファ サイズは 512 バイトから 50KB に増加します。割り当てが必要になるたびに、新しい char[] が作成され、2 つの System.arraycopy
呼び出しが行われます。
https://issues.apache.org/bugzilla/show_bug.cgi?id=43925
このバグ レポートによると、バグは Tomcat 7 のキューに移動されましたが、リリース ノートにはまだ何も表示されていません。その間、Tomcat を使用してこの問題を回避できた人はいますか?
LIMIT_BUFFER=true について読みました。このフラグを設定すると、パフォーマンスが低下すると言われています。コードは現在の sb を解放し、新しいものを 512 バイトに再割り当てします。
public void clear() throws IOException {
467 if (writer != null) {
468 throw new IOException();
469 } else {
470 nextChar = 0;
471 if (LIMIT_BUFFER && (cb.length > Constants.DEFAULT_TAG_BUFFER_SIZE)) {
472 bufferSize = Constants.DEFAULT_TAG_BUFFER_SIZE;
473 cb = new char[bufferSize];
474 }
475 }
476 }
このコードが同じリクエストで複数回呼び出されると、小さなバッファからやり直さなければならなくなり、ガベージ コレクションを取得するためにさらに多くの cb を作成することになります。
バグ レポートに提案された変更がありますが、誰かがこの問題を修正するために何かを実装しているのではないかと思っていSystem.arraycopy
ます。ありがとう!