Java Memory:jstat vs Runtime.getRuntime()。freeMemory();

时间:2012-12-21 09:34:08

标签: java java-ee memory memory-management

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

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

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

1 个答案:

答案 0 :(得分:1)

据我所知,运行时内存方法仅报告HEAP作为总数(因此所有值都是旧的,伊甸园,幸存者和永久物的总和)。这就是为什么你的值会关闭的原因,因为没有jstat输出告诉你整体堆利用率。

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

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

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