我在 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
调用。谢谢!