Tomcat 中 LIMIT_BUFFER=true 标志的影响

Ara*_*j G 3 java tomcat jsp-tags out-of-memory

我正在 Tomcat 中运行我的应用程序,由于 char 数组,我收到 OutofMemory 错误。我参考了Tomcat关于这个错误的错误报告。现在我决定在 catalina.properties 中添加 org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true

我的问题是,

1.设置这个值后有什么副作用?

2.它将清除哪些值(是否会清除会话ID等值)?

Ank*_*hal 5

根据Apache Tomcat 配置上提供的文档,

\n\n

org.apache.jasper.runtime。BodyContentImpl.LIMIT_BUFFER

\n\n
\n

如果为 true,任何扩展超出 org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE 的标记缓冲区都将被销毁,并创建一个默认大小的新缓冲区。

\n\n

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

\n
\n\n

该文档清楚地提到了tag buffer

\n\n

来源参考来看

\n\n

每次您taglibJSP页面上使用标签(例如<c:set> JSTL标签或任何标签)(<jsp:*>标签除外,因为它们不是真正的 \xe2\x80\x9ctags\xe2\x80\x9d 本身,并且处理方式不同),将设置一个 char 缓冲区直到接收该标签的正文。规范Servlet/JSP要求 tag\xe2\x80\x99s 主体的大小没有限制,因此该缓冲区可以无限增长。此外,如果将一个标签嵌套在另一个标签内,则会为嵌套标签设置一个附加缓冲区,依此类推。这些缓冲区全部维护在 PageContext 的堆栈中,但从未真正取消引用。因此,所有这些字符缓冲区将继续存在并由以后的请求重新使用。

\n\n

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

\n\n

这何时相关

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

这里还有一些数据可供阅读。

\n