Java程序使用了多少内存

时间:2015-12-03 15:21:31

标签: java runtime heap-memory

我已经浏览了一下,我已经看到了关于JVM使用了多少内存的问题的大量答案。这些涉及诸如对Runtime.totalMemory()/ Runtime.freeMemory()的调用之类的事情。

但是,这些不考虑垃圾收集。例如,假设我们将大量对象设置为null,这些对象尚未被垃圾回收。调用Runtime.totalMemory()将显示可用的总内存远远低于实际技术上可用的内存,因为这些空对象仍在内存中。

所以我的问题是:有没有更好的方法,无论是在Java本身还是来自第三方工具的数据都可以移植到程序中,动态地告诉Java程序使用了多少内存? / p>

编辑:这需要能够在代码本身中完成。如果没有在发送的每条消息上调用geObjectSize(),我就无法想到另一种方法。

2 个答案:

答案 0 :(得分:0)

你可以像JProfiler这样的探查器,并为特定程序找出实时使用的内存量。

答案 1 :(得分:0)

通常在垃圾收集之前不知道此信息。

垃圾回收后,您可以使用Runtime.totalMemory()Runtime.freeMemory()来计算当前使用的内存量。

  

...说我们有大量的对象设置为null ...

无法将对象设置为null。您可以将对象的引用设置为null。将对象的特定引用设置为null 不会立即将对象标记为有资格进行收集

当对象不再reachable时,可以收集它们。垃圾收集的一部分是确定对象是否不再可访问。

您可以尝试的一件事是向虚拟机建议释放更多内存。但是,这只是一个建议,因此在后续垃圾收集后可能会有更多可用内存。

public long getUpperBoundOfActiveMemoryUsage() {
    System.gc(); // Suggest that some garbage collection occur.

    return getUsedMemory();
}

public long getUsedMemory() {
    Runtime runtime = Runtime.getRuntime();
    long totalMemory = runtime.totalMemory();
    long freeMemory = runtime.freeMemory();
    long usedMemory = totalMemory - freeMemory;
    return usedMemory;
}