如何在Java中获得自由堆大小(不是一起堆栈/方法mem)?

时间:2010-05-21 18:38:05

标签: java heap

我想计算我的应用的堆使用情况。我想获得堆大小的过程值。

如何获取当前正在运行的应用程序的代码值?

修改

有一个赞成的答案不完整/正确。这些方法返回的值也包括堆栈和方法区域,我只需要监视堆大小 使用该代码,当我达到43%时,我得到了HeapError异常,因此我无法使用这些方法来监视堆

Runtime.getRuntime().totalMemory()

4 个答案:

答案 0 :(得分:2)

dbyme的答案并不准确 - 这些运行时调用会为您提供JVM使用的内存量,但此内存不仅仅包含堆,还有堆栈和方法区域,例如

答案 1 :(得分:1)

此信息通过JMX管理界面公开。如果您只想查看它,JConsole或visualvm(JDK的一部分,安装在JAVA_HOME / bin中)可以显示JVM内存使用情况的漂亮图表,可选择分解为各种内存池。

也可以通过编程方式访问此界面;见MemoryMXBean

答案 2 :(得分:1)

MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); 。bean.getHeapMemoryUsage()getUsed();

答案 3 :(得分:0)

确实没有好的答案,因为JVM有多少堆内存与操作系统有免费的堆内存不同两者都不同于可以为应用程序分配多少堆内存

这是因为JVM和OS堆是不同的。当JVM内存不足时,它可能会运行垃圾收集,对自己的堆进行碎片整理,或从操作系统请求更多内存。由于未使用的非垃圾收集对象仍然存在,但在技术上是“免费的”,它们使得空闲内存的概念有点模糊。

另外,堆内存片段;如何/何时/如果内存进行碎片整理取决于JVM / OS的实现。例如,OS堆可能有100MB的可用内存,但由于碎片,最大可用连续空间可能是2MB。因此,如果JVM请求3MB,则可能会出现内存不足错误,即使仍有100MB可用。 JVM不可能提前知道操作系统无法分配3MB。