LIMIT_BUFFER=true 标志在 Tomcat 中的作用

Effect of LIMIT_BUFFER=true flag in Tomcat

我是 运行 我在 Tomcat 中的应用程序,由于 char 数组,我收到内存不足错误。关于此错误,我参考了 Tomcat 的 bug report。现在我决定在 catalina.properties

中添加 org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true

我的问题是,

1.What是设置这个值后的副作用吗?

2.What 是它将清除的值(它会清除会话 ID 等值)吗?

根据 Apache Tomcat Configuration

上可用的文档

org.apache.jasper.runtime。 BodyContentImpl.LIMIT_BUFFER

If true, any tag buffer that expands beyond org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE will be destroyed and a new buffer created of the default size.

If not specified, the default value of false will be used.

文档明确引用了标签缓冲区

来自source reference,

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

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

什么时候相关

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

可能 tomcat 缓存了巨大的标签数据,并存储了它。如果您的应用程序中的页面真的很大,那么它可能会无限增长。设置此 属性 可能不会缓存完整的 tags/html 数据。大 JSP 页面请求会填满内存。

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

This 是报告的问题,但似乎已解决。

要读取的数据很少here, here