我正在尝试解决我们Tomcat Java Web应用程序中的内存泄漏问题,认为当我对其中一个JSP进行重复请求时找到了它。然而,在将其简化为单个空JSP并将其放入运行在jdk1.6上的Tomcat 6.0.37实例中后,我仍然看到相同的情况。
我使用最大堆大小(-Xmx)256m启动Tomcat,并且在我的测试类中进行约282,000次请求后,堆空间将耗尽。
为了进行比较,我还创建了一个HttpServlet,该HttpServlet执行与JSP相同的操作,并修改了我的测试客户端以调用该HttpServlet,这样就可以在不耗尽内存的情况下运行整天。
我已经开始尝试分析堆以弄清楚发生了什么,但没有真正进展。那么,到底是怎么回事?
我使用最大堆大小(-Xmx)256m启动Tomcat,并且在我的测试类中进行约282,000次请求后,堆空间将耗尽。
为了进行比较,我还创建了一个HttpServlet,该HttpServlet执行与JSP相同的操作,并修改了我的测试客户端以调用该HttpServlet,这样就可以在不耗尽内存的情况下运行整天。
我已经开始尝试分析堆以弄清楚发生了什么,但没有真正进展。那么,到底是怎么回事?
<%@ 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
Java测试客户端
public static void main(String[] args) throws Exception {
int i=0;
while(true) {
java.net.URL url = new java.net.URL("http://localhost:8080/test.jsp");
InputStream is = url.openStream();
while(is.read() != -1) {
//nothing, just read the stream
}
is.close();
System.out.println("Requests made: " + i++);
}
}