Java内存:jstat与Runtime.getRuntime().freeMemory()的比较

3

我正在运行一款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

首先,我的代码将显示哪个内存。老年代,伊甸园或幸存者。我认为是老年代。我是正确的吗?

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

1个回答

1
据我所知,Runtime内存方法只报告堆的总体情况(因此所有值都是老年代、伊甸园区、幸存者区和永久代的总和)。这就是为什么您的值会出错,因为没有jstat输出告诉您整体堆利用率的原因。
需要注意的一点是,Runtime.freeMemory()可能不完全准确。从该方法的javadoc中可以看到:
“返回当前可用于未来分配对象的总内存量的近似值,以字节为单位。”
我倾向于不相信Runtime类关于内存的任何返回值。要监视内存使用情况,可以使用外部命令如jconsole或jstat,或在启动java程序时使用-Xloggc。这些方法比我见过的任何API方法更可靠。

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