【发布时间】:2012-07-25 19:58:30
【问题描述】:
我抱怨我的服务器应用程序在高负载时崩溃。
这是一个在Tomcat 5 中运行的网络应用程序。
我看到了线程转储,并且看到了 OutOfMemory 错误
1TISIGINFO 转储事件“systhrow”(00040000) 详细信息
"java/lang/OutOfMemoryError" "创建线程失败: retVal -1073741830, errno 12" >received 1TIDATETIME Date: 2012/07/17 at 20:03:17 1TIFILENAME >Javacore filename: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% 是可运行的。
我不确定如何解释此信息或如何从这里继续检测根本原因。
对此有什么帮助吗?
【问题讨论】:
-
""java/lang/OutOfMemoryError" "Failed to create thread: retVal -1073741830, errno 12" >" 那一段非常重要,调用windows库失败,你需要去看看在 Microsoft 参考(MSDN 等)中查找这些代码,看看它们的含义。
-
@user439407:谢谢!您指的是
retVal或errno,您建议我应该查一下吗?我应该去哪里看? -
两者都有,但 errno 可能会提供更多信息(retval 可能只是表示失败,可能是什么类型的失败,不确定,我没有使用 Windows 的经验)
-
虽然不一定能回答您的问题,但您是否尝试过在 Tomcat 中使用 NIO 或 APR 连接器而不是默认连接器?这样你就不会为每个连接产生一个新线程。
标签: java multithreading debugging tomcat out-of-memory