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

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

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

4

1 回答 1

1

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

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

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

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

于 2013-01-01T14:29:33.597 回答