Java Tomcat JSP请求占用所有堆空间

Java Tomcat JSP请求占用所有堆空间,java,jsp,tomcat,heap,Java,Jsp,Tomcat,Heap,我正在尝试查找Tomcat Java web应用程序中的内存泄漏,并认为我是在重复请求一个JSP时发现的。然而,在将其剥离为单个空JSP并放入运行在jdk1.6上的现成Tomcat 6.0.37实例之后,我仍然看到了同样的情况 我以256m的最大堆大小(-Xmx)启动Tomcat,在下面的测试类发出大约282000个请求后,堆的空间不足 为了进行比较,我还创建了一个HttpServlet,它执行与JSP相同的操作,并修改了我的测试客户机来调用它,它将全天运行而不会耗尽内存 我已经开始尝试分析堆以

我正在尝试查找Tomcat Java web应用程序中的内存泄漏,并认为我是在重复请求一个JSP时发现的。然而,在将其剥离为单个空JSP并放入运行在jdk1.6上的现成Tomcat 6.0.37实例之后,我仍然看到了同样的情况

我以256m的最大堆大小(-Xmx)启动Tomcat,在下面的测试类发出大约282000个请求后,堆的空间不足

为了进行比较,我还创建了一个HttpServlet,它执行与JSP相同的操作,并修改了我的测试客户机来调用它,它将全天运行而不会耗尽内存

我已经开始尝试分析堆以了解这里发生了什么,但实际上没有取得任何进展。Soooo,这是怎么回事

测试JSP

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ page contentType="text/plain"%>
<% System.out.println("Page requested: " + new Date()); %>
This is a test response

JSP请求隐式创建HTTP会话。您没有在HTTP客户机中维护HTTP会话,因此会在每个请求上创建一个全新的HTTP会话。默认情况下,这些会话的过期时间为30分钟。显然,所有这些请求都是在30分钟内发出的

在servlet方法中执行
request.getSession()
时,在servlet中会遇到完全相同的问题

为了“修复”这个“问题”(这在现实世界中不太可能发生;另一方面,赤骨Tomcat实例上的282K并发HTTP会话是相当值得尊敬的),可以禁用JSP中的HTTP会话隐式创建:

<%@page session="false">
另一种方法是减少会话超时,以便服务器有机会在导致堆溢出之前获取会话超时,例如,在
web.xml
中为5分钟:


5.

您可以实现一个
HttpSessionListener
来跟踪HTTP会话的创建和销毁。

ahhh,这很有意义。我看到堆中的
StandardSession
对象的数量与请求的数量大致相同。你是对的,这不是“现实世界的问题”,但了解这一点有助于我调整测试,以期找到实际问题。不客气。探查器可能更有助于发现实际问题。
<%@page session="false">
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));