2010-05-21 51 views
7

我想计算我的应用程序的堆使用情况。我想得到堆尺寸只有的procent值。如何在Java中获得免费的堆大小(不是堆栈/方法mem)?

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

编辑

有一个upvoted答案,这是不完全/正确。这些方法返回的值也包括堆栈和方法区域,我只需要监视堆大小。
与该代码我HeapError异常,当我达到了43%,所以我不能使用这些方法来监测只是堆

Runtime.getRuntime().totalMemory() 

回答

2

dbyme的答案是不准确的 - 这些运行时调用给你的内存量由JVM使用,但此内存不仅仅包含堆,还有堆栈和方法区域,例如

+0

这是事实。当我达到43%的使用率时,我会遇到堆内存错误。 – Pentium10 2010-05-21 20:03:44

+0

良好的通话。我现在很想知道正确的答案。 – dbyrne 2010-05-21 21:06:27

1

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

该接口也可以以编程方式访问;见MemoryMXBean

+0

由于我在Android上,因此无法访问这些内容。 – Pentium10 2010-05-21 21:19:45

+0

然后尝试直接使用接口。我添加了一个链接让你开始。 – meriton 2010-05-21 21:30:21

0

实在没有很好的答案,因为JVM多少堆内存提供免费是不一样的多少堆内存操作系统有免费,这两者都是没有多少堆内存相同可以分配给您的应用程序

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

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

+0

您如何检测到您的应用程序处于危急情绪,达到该级别? – Pentium10 2010-05-21 21:36:29

+0

@ Pentium10:[用大堆启动Java](http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#0.0.0.%20Total%20Heap|outline),那么当你想要检查,手动运行垃圾收集器,然后检查可用空间。我会说任何低于40%的东西都是坏的,但是正如你所看到的那样,可能会导致内存消耗甚至更多的空闲内存。另外,手动运行垃圾回收器的速度非常慢,并且不是您想要在任何实际应用程序中执行的操作。你为什么做这个? – 2010-05-21 21:43:44

+0

我有一种在Android移动设备上运行的回溯生成过程,我无法用大堆堆启动Java。我必须在太迟之前停止生成过程。 – Pentium10 2010-05-21 21:45:18

1

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