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,但似乎已解决.
标签:jsp-tags,tomcat,out-of-memory,java 来源: https://codeday.me/bug/20191118/2029936.html