首页 > 解决方案 > Tomcat 在尝试发送 HTTP 请求时崩溃并出现 java.lang.OutOfMemory 错误

问题描述

我们在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崩溃的原因可能是什么?是因为以下任何一个原因吗?

  1. 大部分资源之类outputstream and inputstream的都没有关闭?
  2. HttpsURLConnectioncon也没有关闭/断开连接?
  3. 如果是这样,那为什么它不会每次都发生。事实上,这是两个多月以来第一次观察到这种情况。
  4. 我还看到 OME 是由 ByteArray 或类似的东西抛出的。不确定。只记得看到了一些东西。
  5. 除了日志,还看到了以下异常:线程“AsyncFileHandlerWriter-#######”中的异常

我现在被困住了,担心这种情况可能会再次发生。我需要找到同样的根本原因。任何有关相同的帮助或建议都会非常有用。

标签: javaout-of-memorytomcat8

解决方案


将以下内容添加到您的 jvm 参数中:

-Xms512m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError

下次发生错误时,您应该会在启动文件夹中看到一个 *.hprof 文件。使用分析器打开它,我最喜欢的是yjpmat。两者都将向您显示应用程序中堆的主要竞争者以及线程数和资源使用情况。

希望这可以帮助。


推荐阅读