我们已经在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这样的大多数资源都没有关闭?
  • HttpsURLConnection con是否未关闭/断开连接?
  • 如果是这样,那么为什么它不会每次都发生。实际上,这是几个月以来首次观察到的情况。
  • 我还看到OME被ByteArray或类似的东西抛出。不确定。只要记得看到的东西。
  • 与日志一起,还看到以下异常:
    线程“AsyncFileHandlerWriter-#######”中的异常


  • 我现在陷入困境,担心这种情况可能再次发生。我需要找到相同的根本原因。关于此的任何帮助或建议将非常有用。

    最佳答案

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

    -Xms512m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError
    

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

    希望这可以帮助。

    08-27 20:11
    查看更多