gpt4 book ai didi

java - LIMIT_BUFFER=true 标志在 Tomcat 中的作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:41 25 4
gpt4 key购买 nike

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

我的问题是,

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

2.它将清除哪些值(会清除 session 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 ,

每次使用 taglib标记在你的 JSP 上页面像<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 缓存了巨大的标签数据,并存储了它。如果您的应用程序中的页面真的很大,那么它可能会无限增长。设置此属性可能不会缓存完整的标签/html 数据。大型 JSP 页面请求会填满内存。

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

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

要阅读的数据很少 here , here .

关于java - LIMIT_BUFFER=true 标志在 Tomcat 中的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com