【发布时间】:2014-07-07 13:50:04
【问题描述】:
我正在处理WAS 6.1 中的以下OutOfMemory 异常。
Exception in thread "UnitHoldingsPolicySummary" java.lang.OutOfMemoryError: unable to create new native thread.
我已经对此进行了大量研究以防止这种情况发生。谷歌搜索后,我发现,当 Native 内存由于同时创建大量线程而耗尽时,就会发生这种情况。
现在,在分析下面的日志之后,我们可以发现,在应用程序内部,线程是显式创建的,我读到这是一个非常非常糟糕的做法。 (请专家确认一下?)
07/07/14 08:50:38:165 BST] 0000142c SystemErr R Exception in thread "xxxxxx" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:574)
at com.fp.sv.controller.business.thread.xxxxxxxxxexecute(Unknown Source)
at com.fp.sv.controller.business.thread.xxxxxxxxx.run(Unknown Source)
at java.lang.Thread.run(Thread.java:595)
我更喜欢 WAS 管理,但对 Java 和 Java 中的线程创建知之甚少。现在我需要与开发人员讨论这个问题,但在此之前我想 100% 确认我的发现是正确的,开发人员应该通过不明确创建线程来更正代码。
在将此归咎于代码之前,我需要在应用服务器端检查哪些内容?
在 solaris 上,我正在触发命令 pmap -x 9547|grep -i stack|wc -l 以检查在该时间实例上创建了多少线程。我可以在“OutOfMemory”问题期间看到,这个数字非常高。
您能否确认此命令是否是检查当前活动线程数的好方法?
用我的最新发现编辑问题
此外,当此问题发生时,同时一个 MQ 队列会堆积起来,因为 WAS 不会从队列中提取消息。我可以在特定于应用程序的日志中看到以下错误。
Non recoverable Exception detected whilst connecting to queue manager or response queue
Underlying reason = MQJE001: Completion Code 2, Reason 2102
这个问题是否也与 MQ 相关?这又会导致 OutOfMemory 问题?
问候, 拉胡尔
【问题讨论】:
标签: java multithreading websphere out-of-memory ibm-mq