如何以编程方式获取堆栈内存统计信息?

时间:2014-11-10 00:37:33

标签: java memory jvm stack

我正在编写一个简单的内存报告实用程序(在这种特殊情况下,使用现有工具不是一种选择)。我已经让它打印迭代ManagementFactory.getMemoryPoolMXBeans()返回的所有内存池的max,commit和usage。这让我获得了三堆堆内存(eden,survivor和old),permgen和“代码缓存”。

这些似乎都不是方法堆栈内存。最接近的似乎是“代码缓存”,但我已经读过,这实际上是hotspotter放置编译类的地方。

我问,因为我试图找出JBoss网络应用程序崩溃的原因而无法创建新线程。 http://www.mastertheboss.com/jboss-server/jboss-monitoring/how-to-solve-javalangoutofmemoryerror-unable-to-create-new-native-thread表明这可能是由于堆栈内存耗尽,这是有道理的。问题是:我如何获取堆栈内存,所以我可以查看?

1 个答案:

答案 0 :(得分:1)

在Linux上,您可以解析/proc/self/maps(或/proc/self/smaps以获取更多详细信息) 查找以[stack:NNN]结尾的行,并将堆栈大小计算为top - bottom

7f8a5c0e1000-7f8a5c1df000 rw-p 00000000 00:00 0    [stack:2669]
^ bottom     ^ top                                        ^ tid

在Windows上这会更难,但你可以估计堆栈使用的内存为
number_of_threads * default_stack_size