一尘不染

如何检测OutofMemoryError的原因?

tomcat

我抱怨我的服务器应用程序在高负载下崩溃了。
这是一个在中运行的网络应用Tomcat 5
我看到线程转储,并且看到OutOfMemory错误

1TISIGINFO转储事件“ systhrow”(00040000)详细信息
“ java / lang / OutOfMemoryError”“未能创建线程:retVal -1073741830,errno
12”>收到1TIDATETIME日期:2012/07/17 at 20:03:17 1TIFILENAME> Javacore文件名:C:\
ServerApplication \ Tomcat5 \ bin \ javacore.34545719.4646464.4172.0003.txt

堆信息如下:

Maximum Java heap size : 1500m    
Initial Java heap size : 256m

这是初始和最大堆大小的配置(32位Java)

我还看到有可用的空闲堆空间

1STHEAPFREE    Bytes of Heap Space Free: 2D19F3C0   
1STHEAPALLOC   Bytes of Heap Space Allocated: 5DC00000

这是大约750MB的可用空间,对吗?

而从线程方法分析我看到的线程数是695的这49%java/lang/Object.wait(Native Method)39%sun/misc/Unsafe.park(Native Method)
另外我看到这个NO JAVA STACK 1%不知道是什么意思。
另外0踩死锁并且2%是可运行的。

我不确定如何解释此信息或如何从此处继续进行检测以找出根本原因。
有什么帮助吗?


阅读 416

收藏
2020-06-16

共1个答案

一尘不染

根据这篇文章

java.lang.OutOfMemoryError有两种可能的原因:无法创建线程消息:

  • 正在运行的线程太多,并且系统用尽了内部资源来创建新的线程。
  • 系统已用完本机内存以用于新线程。线程需要用于内部JVM结构,Java™堆栈和本地堆栈的本地内存。

因此,此错误可能与内存完全无关,只是创建了太多线程…

编辑:

由于拥有695个线程,因此需要695倍的堆栈大小作为内存。考虑到这篇关于线程限制的文章,我怀疑您正在尝试为可用的虚拟内存空间创建太多线程。

2020-06-16