【问题标题】:Java Memory : jstat vs Runtime.getRuntime().freeMemory();Java 内存:jstat 与 Runtime.getRuntime().freeMemory();
【发布时间】:2012-12-21 09:34:08
【问题描述】:

我正在运行一个 java 应用程序,我在下面观察到:

通过代码我正在计算内存利用率:

long freeMemory = Runtime.getRuntime().freeMemory();
this.memUsage = 100f - (freeMemory*100)/this.maxMemory;
where
instance.maxMemory = Runtime.getRuntime().maxMemory();

时间戳 S0 S1 E O P YGC YGCT FGC FGCT GCT

2849.6 0.00 84.80 93.14 16.95 60.00 483 140.140 8 3.649 143.789

首先我的代码将显示哪个内存。Old、Eden 或 Survivor。我认为 Old..m i rgt ??

在特定时间,我观察到与 jstat 旧内存利用率相比,我的代码给了我不同的输出。 像这里 jstat old 显示大约 17% 而我的代码显示 20%。这有什么原因吗??

【问题讨论】:

    标签: java jakarta-ee memory memory-management


    【解决方案1】:

    据我所知,运行时内存方法仅报告 HEAP 的总数(因此所有值都是 old、eden、survivor 和 Permanent 的总数)。这就是为什么您的值会关闭的原因,因为没有 jstat 输出告诉您总体堆利用率。

    关于Runtime.freeMemory() 需要注意的一点是它可能并不完全准确。来自方法的javadoc:

    返回近似值当前可用于未来分配的对象的内存总量,以字节为单位。

    我倾向于不相信任何从 Runtime 类返回的关于内存的值。使用 jconsole 或 jstat 之类的外部命令来获取内存统计信息,或者在启动 java 程序时使用-Xloggc。这些方法比我见过的任何 API 方法都更可靠地监控内存使用情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2017-01-29
      • 1970-01-01
      • 2021-09-14
      • 2012-06-21
      • 2012-09-09
      相关资源
      最近更新 更多