tomcat中session对象致使的OOM问题

为何要自定义session?

首先咱们来作一个实验,建立一个web项目,放到tomcat下,而后对这个项目的index.jsp使用JMeter进行压测:<br>html

首先设置tomcat当发生OOM时保存堆栈的信息, 修改catalina.bat文件,添加java

set JAVA_OPTS=%JAVA_OPTS% -Xms64m -Xmx64m -XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=F:\dumpinfo\

设置tomcat启动时堆内存的初始化和最大内存大小都是64M(方便测试),-XX:+HeapDumpOnOutOfMemoryError表示当发生内存溢出时自动生成dump文件, -XX:HeapDumpPath=F:\dumpinfo\设置dump文件保存的路径web

index.jsptomcat

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>首页</title>
  </head>
  <body>
    Hello This is index.jsp
  </body>
</html>

启动Tomcat,咱们先来看一下没有用户请求时tomcat的堆内存的信息,经过JVisualVM工具来看一下:服务器

输入图片说明 在没有请求的时候tomcat的内存使用率还不到一半,下面经过JMeter来进行压测:session

首先使用200个线程来模拟200个用户对tomcat进行请求:并发

输入图片说明 输入图片说明 输入图片说明 当执行到到84771个请求时发生了OOM,咱们来分析一下dump文件,看一下哪些对象占用的内存太多(使用MAT来分析) 输入图片说明jsp

经过MAT来看,session所占的内存达到了29M之多,快占用了一半的内存,,session果真是一个重量级的对象。工具

下面咱们在tomcat中禁用session,再进行压测看一下内存使用状况。 输入图片说明测试

执行到210000次请求的时候也没有发生内存溢出的问题,所以,刚刚发生的OOM问题就是session致使的,在请求和并发比较大的web项目中,咱们能够经过自定义session实现来减轻服务器由于建立过多的session而致使OOM的问题。

相关文章
相关标签/搜索