我们已经在Tomcat 8上部署了服务。它通常可以正常运行,但是可以观察到tomcat有时会突然崩溃。今天,当它出现时,我发现存在以下日志:
SEVERE org.apache.tomcat.util.net.NioEndpoint$Acceptor.run
java.lang.OutOfMemoryError: Java Heap Space
我发现,这是在服务尝试执行POST请求时发生的。相同的代码如下:
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
Tomcat崩溃的原因可能是什么?是否由于以下原因之一?
outputstream and inputstream
这样的大多数资源都没有关闭? con
是否未关闭/断开连接? 线程“AsyncFileHandlerWriter-#######”中的异常
我现在陷入困境,担心这种情况可能再次发生。我需要找到相同的根本原因。关于此的任何帮助或建议将非常有用。
最佳答案
将以下内容添加到您的jvm参数中:
-Xms512m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError
下次发生错误时,您应该在启动文件夹中看到一个* .hprof文件。使用分析器打开它,我的最爱是yjp和mat。两者都将向您显示应用程序中堆的主要竞争者,以及线程数和资源使用情况。
希望这可以帮助。