【问题标题】:Effect of LIMIT_BUFFER=true flag in TomcatTomcat 中 LIMIT_BUFFER=true 标志的影响
【发布时间】:2016-09-07 16:19:55
【问题描述】:

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

我的问题是,

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

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

【问题讨论】:

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


    【解决方案1】:

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

    org.apache.jasper.runtime。 BodyContentImpl.LIMIT_BUFFER

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

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

    文档清楚地提到了标签缓冲区

    来自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缓存了巨大的标签数据,并存储了它。如果您的应用程序中的页面非常大,那么这可能会无限增长。设置此属性可能不会缓存完整的标签/html 数据。大型 JSP 页面请求会填满内存。

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

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

    要读取的数据很少herehere

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 2018-08-13
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      相关资源
      最近更新 更多