我抱怨我的服务器应用程序在高负载时崩溃。
这是一个运行在以下位置的网络应用程序Tomcat 5
.
我看到线程转储,并且发现存在 OutOfMemory 错误
1TISIGINFO 转储事件“systhrow”(00040000) 详细信息
“java / lang / OutOfMemoryError”“无法创建线程:retVal -1073741830,errno 12”>收到1TIDATETIME日期:2012年7月17日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%
is java/lang/Object.wait(Native Method)
and 39%
is in sun/misc/Unsafe.park(Native Method)
我也看到这个NO JAVA STACK 1%
不确定那是什么意思。
还有 0 个踏板陷入僵局并且2%
是可运行的。
我不确定如何解释此信息或如何从这里继续检测根本原因。
对此有什么帮助吗?
根据这个帖子 http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/problem_determination/win_oom_thread.html:
导致 java.lang.OutOfMemoryError 的可能原因有两种:
创建线程消息失败:
- 正在运行的线程太多,系统已耗尽内部资源来创建新线程。
- 系统已耗尽可用于新线程的本机内存。线程需要用于内部 JVM 结构的本机内存,即 Java™
堆栈和本机堆栈。
所以这个错误很可能与内存完全无关,只是创建了太多线程......
EDIT:
由于您有 695 个线程,因此您需要 695 倍堆栈大小的内存。考虑到这个帖子 http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx关于线程限制,我怀疑您正在尝试为可用虚拟内存空间创建太多线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)