如何诊断Tomcat 7中的OutOfMemoryErrors?

时间:2014-12-11 09:44:16

标签: java tomcat java-ee tomcat7

我在Tomcat7实例中运行了几个应用程序。

有一段时间,我注意到日志中有OutOfMemoryErrors。

我怎样才能找出哪个应用程序(理想情况下 - 哪个)类导致它们?

更新1(25.12.2014 11:44 MSK):

我在应用程序中更改了某些内容(在销毁servlet上下文时添加了对Quartz调度程序的关闭调用),这可能导致内存泄漏。

现在我的记忆消耗图表如下所示。

Memory consumption charts

它们中的任何一个是否表明应用程序中存在内存泄漏?

如果是,哪一个?

3 个答案:

答案 0 :(得分:3)

有关于http://www.oracle.com/technetwork/java/javase/clopts-139448.html

的详细文档
  • 使用上面链接中描述的vm参数创建一个heapdump。
  • 分析此heapdump,例如使用memoryanalzyer(https://eclipse.org/mat/)。

答案 1 :(得分:1)

OOM 可能因为很多原因而发生。

1。)内存泄漏

2。)生成大量局部变量等。

OOM是内存泄漏的常见迹象。实质上,当没有足够的空间来分配新对象时,会抛出错误。

几乎没有异常消息

  1. java.lang.OutOfMemoryError:Java堆空间
  2. java.lang.OutOfMemoryError:PermGen space
  3. java.lang.OutOfMemoryError:请求的数组大小超过VM限制
  4. java.lang.OutOfMemoryError:请求字节数。没有交换空间?
  5. java.lang.OutOfMemoryError :(原生方法)
  6. 更详细的信息hereofficial

    参考thisthis

    需要分析堆转储/线程转储等。

    Detecting Memory leak

答案 2 :(得分:0)

您可以使用jmap。它将给出java进程的快照。

内存中有多少个对象大小的对象。

jmap -histo #processID