在tomcat中进行简单的SESSION操作,内存使用量持续增长

时间:2018-12-14 03:56:48

标签: java session tomcat

我正在Tomcat 8.0.50的存储盒上运行JDK 1.8.0 update 111的{​​{1}}。

在简单的JSP文件的压力测试期间,这是默认配置,没有配置JAVA_OPTS,

128 GB

内存使用量继续增长,

<%@ page import="java.io.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String normal_querystring = "?params=whatever";
session.setAttribute("time", normal_querystring+System.currentTimeMillis());
%>

我知道Java would use 1/4 of the physical memory可用,但是像这样的简单JSP文件怎么会占用这么多内存?

此外,gc无效:

root     21056  123 17.9 40884708 23744644 pts/1 Sl 11:10  52:18 /home/work/jdk1.8.0_111/jre/bin/java -Djava.util.logging.config.file=/home/test/apache-tomcat-8.0.50/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dignore.endorsed.dirs= -classpath /home/test/apache-tomcat-8.0.50/bin/bootstrap.jar:/home/test/apache-tomcat-8.0.50/bin/tomcat-juli.jar -Dcatalina.base=/home/test/apache-tomcat-8.0.50 -Dcatalina.home=/home/test/apache-tomcat-8.0.50 -Djava.io.tmpdir=/home/test/apache-tomcat-8.0.50/temp org.apache.catalina.startup.Bootstrap start

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以进行数学计算:您正在将数据保存到会话中。我假设您的测试量很大(我从未听过“压力测试”一词,我将其称为“负载测试”)并尝试在给定的时间内请求尽可能多的页面。

假设所有负载测试都没有会话cookie,那么每个新请求都将启动一个新会话,您将为每个请求创建一个新的会话对象。找出会话对象的大小(提示:您最不关心的时间戳记是保存在其中)

您将知道您的服务器每秒或每分钟处理多少个请求。现在请记住,Tomcat中的默认会话生存期为30分钟(除非您另行配置)。这将使您感觉在测试运行30分钟后可以期待多少个会话对象。在那之后,内存消耗将更加直线化-但是在那之前,没有任何GC可以帮助您降低需求,因为它们都仍在使用中并且尚未过期。

并且,一旦开始配置服务器内存,请使用CATALINA_OPTS,而不是JAVA_OPTS