如何以编程方式获取堆栈内存统计信息?
我正在编写一个简单的内存报告实用程序(在这种特殊情况下使用现有工具不是一种选择)。 我已经得到它来打印由迭代ManagementFactory.getMemoryPoolMXBeans()
返回的所有内存池的最大值,提交和使用情况。 这让我获得了三代堆内存(eden,幸存者和旧),permgen和“代码缓存”。
这些似乎都不是方法堆栈内存。 最接近的东西似乎是“代码缓存”,但我已经读过,这实际上是热点放置编译类的地方。
我问,因为我试图追查一个没有创建新线程的JBoss web应用程序崩溃的原因。 http://www.mastertheboss.com/jboss-server/jboss-monitoring/how-to-solve-javalangoutofmemoryerror-unable-to-create-new-native-thread表明这可能是由于堆栈内存用完,这是有道理的。 问题是:如何获取堆栈内存,以便我可以检查?
在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