2013-10-15 18 views
2

我试图分析我的应用程序已抛出内存异常如下。如何执行C堆分析

java.lang.OutOfMemoryError:无法创建新的本地线程

在谷歌上搜索了一下,我能够发现,这可能是因为C堆已用尽。我检查了GC日志,堆内存可用,那不是罪魁祸首。我需要分析c堆内存使用情况。有没有提供这种分析的工具?

当堆(年轻的gen/old gen)已满时,垃圾回收会释放内存,但如果堆已满,该怎么办? JVM /如何在这里释放内存?

编辑: 我检查了比我的应用程序能够处理的线程数少得多。所以线程似乎不是这里的原因。当线程数增加但应用程序在中等负载和中等线程数的情况下运行很长时间时,不会发生异常。

+0

http://valgrind.org/? – Cillier

+0

这个问题感觉像是患有[XY问题](http://meta.stackexchange.com/a/66378/176058)。 OOME:无法创建新的本地线程通常会发生,因为您必须一次运行多个活动线程。为什么你有这么多的线索,你怎么能减少这个数字。这可能是你的'X',你应该问一下,而不是你提出的'Y'(C堆分析)。 – Dev

+0

感谢您的回复。我检查过的线程数比我的应用程序能够处理的要少得多。所以线程似乎不是这里的原因。当三次计数增加但应用程序在中等负载和中等线程数的情况下长时间运行时,不会发生异常。 – Chinta

回答

0

如果你正在使用JNI(或调用它),你的本地代码可能会有内存泄漏。特别是C和C++没有垃圾回收,所以这很容易导致意外。