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

我正在编写一个简单的内存报告实用程序(在这种特殊情况下使用现有工具不是一种选择)。 我已经得到它来打印由迭代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

链接地址: http://www.djcxy.com/p/14521.html

上一篇: How do I get stack memory stats programatically?

下一篇: Is frame in JVM heap allocated or stack allocated?