【问题标题】:Java: inaccurate result when calculating memory usageJava:计算内存使用量时结果不准确
【发布时间】:2012-04-26 23:43:59
【问题描述】:

我想计算我的 java 应用程序的当前内存使用情况。但是,当我使用以下代码时,任务管理器中显示的内容有很大不同。

Runtime rt = Runtime.getRuntime();
long usedMemory = (rt.totalMemory() - rt.freeMemory()) / 1024;

根据任务管理器,当进程消耗 3.000.000 K 时,此代码将例如计算 2.015.203 和一秒钟后的 1.712.296,实际上内存使用量已经增长。

根据类似的问题,代码应该没问题,但为什么和任务管理器相比差别这么大?

【问题讨论】:

  • JVisualVM 报告什么 - 它与 TaskManager 有什么不同?
  • 你在看任务管理器的哪一栏?内存列很多。
  • 你为什么想知道?这不是一个轻率的问题。 Java 是一个高度复杂的托管环境,在几乎所有情况下,您都不应该尝试通过询问操作系统来为它做出进程管理决策。

标签: java memory jvm


【解决方案1】:

TaskManager 告诉您 Java 进程(JVM)的所有可用内存。

在内部,JVM 根据程序的需要管理此内存(因此,在 JVM 内部有“空闲”内存,但对 TaskMan 来说似乎已使用)。

此外,GC 会在它认为最有用时释放内存。所以,很有可能在创建更多对象后,使用的内存变少了,因为 GC 已经清扫了之前分配(但无法访问)的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多