Tomcat中LIMIT_BUFFER = true标志的影响

时间:2016-05-12 03:12:15

标签: java tomcat out-of-memory jsp-tags

我在Tomcat中运行我的应用程序,由于char数组,我得到OutofMemory错误。我提到了Tomcat的bug report这个错误。现在我决定在catalina.properties中添加org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER = true

我的问题是,

1.设定此值后的副作用是什么?

2.它将清除的值是什么(它会清除像会话ID这样的值吗?)

1 个答案:

答案 0 :(得分:3)

根据Apache Tomcat Configuration上提供的文件,

<强> org.apache.jasper.runtime。 BodyContentImpl.LIMIT_BUFFER

  

如果为true,则任何扩展超出的标记缓冲区   org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE将被销毁   以及使用默认大小创建的新缓冲区。

     

如果未指定,将使用默认值false。

文档明确指出标记缓冲区

来自source reference

每次在taglib页面上使用JSP标记,例如<c:set> JSTL标记或任何标记(<jsp:*>标记除外)不是真正的“标签”,并且处理方式不同),将设置一个char缓冲区来接收该标签的主体。 Servlet/JSP规范要求对标签主体的大小没有限制,因此该缓冲区可以无限增长。此外,如果将标记嵌套在另一个标记内,则会为嵌套标记设置其他缓冲区,依此类推。这些缓冲区都保存在PageContext的堆栈中,但从未实际解除引用。因此,所有这些字符缓冲区将继续存在并被以后的请求重用。

LIMIT_BUFFER 的作用是强制Tomcat在每次使用之前丢弃缓冲区,如果它大于默认大小(512个字符)并分配一个默认大小的新缓冲区(当然可能会增长)如果它不足以处理标签体。)

什么时候相关

如果你的标签体积非常大,这主要是一个问题。例如,400个工作线程的平均标签嵌套深度为3 = 400 * 3 * 512 = ~614 KB。但是说你正在使用磁贴,你有一个1 MB大的页面和5个级别的模板。然后你会看到无限期分配2 GB的内存。而且你必须考虑最坏的情况,因为最终,每个工作者线程将至少服务一个大页面而没有LIMIT_BUFFER,一旦这些缓冲区已经调整大小,它们将永远不会缩小。

似乎tomcat会缓存巨大的标签数据并存储它。如果应用程序中的页面非常大,那么这可能会无限增长。设置此属性可能不会缓存完整的标记/ html数据。大型JSP页面请求可以填满内存。

根据文档,它似乎缓存session id

This是报道的问题,但似乎已修复。

更多数据需要阅读herehere