我正在尝试在我们的 Tomcat Java Web 应用程序中发生内存泄漏,并认为我在向我们的一个 JSP 发出重复请求时发现了它。但是,在将其剥离为单个空 JSP 并放入运行在 jdk1.6 上的开箱即用的 Tomcat 6.0.37 实例之后,我仍然看到相同的情况。
我以 256m 的最大堆大小 (-Xmx) 启动 Tomcat,并且在下面的测试类发出大约 282,000 个请求后,堆空间不足。
作为比较,我还创建了一个与 JSP 执行相同操作的 HttpServlet,并修改了我的测试客户端以改为调用它,并且它将运行一整天而不会耗尽内存。
我已经开始尝试分析堆以弄清楚这里发生了什么,但并没有真正到达任何地方。呜呜呜,这是怎么回事??
测试 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
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++);
}
}