java - tomcat中简单的SESSION操作,内存占用持续增长

标签 java session tomcat

我在跑 Tomcat 8.0.50JDK 1.8.0 update 111 , 在带有 128 GB 的盒子上内存。

这是一个没有配置 JAVA_OPTS 的默认安装,在一个简单的 JSP 文件的压力测试中,

<%@ 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());
%>

内存使用量持续增长,

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

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

此外,gc 不起作用:

> jcmd 21056 GC.run
21056:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
    at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
    at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)
    at sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:147)
    at sun.tools.jcmd.JCmd.main(JCmd.java:131)

有什么想法吗?

最佳答案

您可以计算一下:您正在将数据保存到 session 中。我假设您的测试量很大(我从来没有听说过“压力测试”这个词,我将其归档为“负载测试”)并尝试在给定的时间内请求尽可能多的页面。

假设您的负载测试都没有 session cookie,因此每个新请求都会启动一个新 session ,您将为每个请求创建一个新 session 对象。计算出 session 对象的大小(提示:你保存在那里的时间戳是你最不关心的)

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

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

关于java - tomcat中简单的SESSION操作,内存占用持续增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53773330/

相关文章:

java - 对多个应用程序使用同一个 session

php - 使用 AJAX 自动刷新在 Web 应用程序上超时的方法

java - OpenShift 3 Tomcat Hello World 示例

JSF 中的 Java Web 服务 URL

java - 数据库连接期间的加载程序

http - Google Analytics - 异常会停止 session 吗?

tomcat - 解压 tomcat.tar.gz 并在 cargo container 中启动 tomcat

java - 当从 Quartz 调度程序调用函数时,如何将 Http 请求/响应作为参数传递给函数?

java - Spring启动 org.springframework.data.repository.config.BootstrapMode

java - 尽管流量低,但 Tomcat 上的平均负载异常高