2

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ます。ありがとう!

4

1 に答える 1

0

いいえ、この機能強化要求に関してこれ以上の動きはありません。

LIMIT_BUFFER=true を使用します。パフォーマンスの問題があると思われる場合と同様に、アプリケーションをプロファイラーで実行して、本当に懸念すべきことがあるかどうかを確認してください。たくさんのオプションがあります。オープンソース開発者に無料でコピーを提供しているため、私は YourKit を使用しています。

于 2012-05-02T21:32:34.183 に答える