【问题标题】:How to calculate memory usage of a Java program?如何计算 Java 程序的内存使用量?
【发布时间】:2016-10-21 07:58:21
【问题描述】:

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

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

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

我需要计算程序使用的实际内存。 这些在线编译器使用什么方式来计算程序使用的内存?

【问题讨论】:

  • 哪个在线编译器?
  • 一般来说:如果您需要了解应用程序的性能/内存“行为”,那么您需要认真研究分析工具。你想观察一段时间。使用您的问题中提到的电话拍摄一次性快照只能为您提供非常有限的信息。
  • @Onur codechef.com/ide 是我正在寻找编译的一个。

标签: java memory-management runtime


【解决方案1】:

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

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() 可能会给你不同的结果。

【讨论】:

  • 如果方法创建了大量的临时对象,简单的减法可能会产生不相关的数据。实际内存消耗取决于清除所有冗余对象的 gc。
  • 如果在执行函数时垃圾收集被踢怎么办?
【解决方案2】:

您可以在 ubuntu 中使用 top 命令来检查运行 java 程序时的 % CPU 使用率或 % 内存使用率。

top 命令会给你这么多信息。

PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+ COMMAND

只需输入 top 然后回车 在您的终端中并在命令部分检查 java。

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2011-09-03
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多