我已经浏览了一下,我已经看到了关于JVM使用了多少内存的问题的大量答案。这些涉及诸如对Runtime.totalMemory()/ Runtime.freeMemory()的调用之类的事情。
但是,这些不考虑垃圾收集。例如,假设我们将大量对象设置为null,这些对象尚未被垃圾回收。调用Runtime.totalMemory()将显示可用的总内存远远低于实际技术上可用的内存,因为这些空对象仍在内存中。
所以我的问题是:有没有更好的方法,无论是在Java本身还是来自第三方工具的数据都可以移植到程序中,动态地告诉Java程序使用了多少内存? / p>
编辑:这需要能够在代码本身中完成。如果没有在发送的每条消息上调用geObjectSize(),我就无法想到另一种方法。
答案 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;
}