编程语言
首页 > 编程语言> > java-Tomcat中LIMIT_BUFFER = true标志的作用

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

作者:互联网

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

我的问题是

1.设置此值后会有哪些副作用?

2.它将清除哪些值(会清除会话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:*>标记,因为它们并不是真正的“标记”,并且处理方式不同),将设置一个char缓冲区来接收该标记的主体. Servlet / JSP规范要求对标签主体的大小没有限制,因此该缓冲区可以无限增长.此外,如果将标签嵌套在另一个标签中,则会为嵌套标签设置一个额外的缓冲区,依此类推.这些缓冲区都保存在PageContext中的堆栈中,但从未真正取消引用.因此,所有这些字符缓冲区将继续存在并在以后的请求中重新使用.

LIMIT_BUFFER的作用是强制Tomcat在每次使用前都大于默认大小(512个字符)丢弃该缓冲区,并分配一个具有默认大小的新缓冲区(如果不足以处理标记主体,则该缓冲区可能会增加) .

什么时候相关

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

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

根据文档,它似乎确实在缓存会话ID.

报告了该问题This,但似乎已解决.

很少有其他数据可以读取herehere.

标签:jsp-tags,tomcat,out-of-memory,java
来源: https://codeday.me/bug/20191118/2029936.html