如何计算Java程序的内存使用量?

21

如果我使用Runtime类(freeMemory()totalMemory()gc()), 那么它会给我超过 MB 的内存(即 1,000,000 字节)。

但是,如果我在任何在线编译器上运行相同的代码,它们会显示以 KB(即 1000 字节)为单位使用的内存。这是一个巨大的差异。

这意味着Runtime不会显示程序实际使用的内存。

我需要计算程序实际使用的内存。这些在线编译器使用了哪种方法来计算程序使用的内存?


哪个在线编译器? - Onur
1
一般而言:如果您需要了解应用程序的性能/内存“行为”,那么您需要认真研究分析工具。您需要随时间观察。仅使用像您问题中提到的调用这样的一次性快照只能提供非常有限的信息。 - GhostCat
@Onur,codechef.com/ide 是我正在寻找编译的一个网站。 - Ganesh S
2个回答

35

首先,在你的代码执行之前计算使用的内存,即代码的第一行。

long beforeUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();

计算代码执行后使用的内存:

long afterUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();

然后你可以执行:

long actualMemUsed=afterUsedMem-beforeUsedMem;

它将为您提供程序实际使用的内存。

如果需要进一步的内存分析,您最好使用任何分析工具,如jvisualvm

  • 请记住,Runtime.getRuntime().totalMemory() 表示JVM可用的总内存。
  • java -Xms512m -Xmx1024m 的意思是,该程序的总内存从512MB开始,可能会懒惰地加载到最大的1024MB。
  • 因此,如果您在不同的JVM上运行相同的程序,则 Runtime.getRuntime().totalMemory() 可能会给出不同的结果。

如果方法创建大量临时对象,简单的减法可能会产生无关数据。实际的内存消耗取决于清除所有冗余对象的垃圾收集器。 - ayvango
1
如果在执行函数时垃圾回收启动会怎样? - yathartha

6
您可以在Ubuntu中使用top命令来查看运行Java程序时的% CPU使用率或%内存使用率。 top命令将提供以下信息。 PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+ COMMAND 只需在终端中键入top, 然后按回车键并在命令部分检查Java即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接