2

我在 apache 上阅读了一些关于 BodyContentImpl 效率低下以及它如何分配 cb 空间的错误报告。( private char[] cb;) 如果一个标签写出 50KB 的 HTML,缓冲区大小将从 512 字节增加到 50KB,每次需要分配时,它都会创建一个新的 char[] 并进行两次 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 回答