ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-18 18:01:26  阅读:403  来源: 互联网

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


我在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有