我正在运行一个 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 旧显示大约 17% 而我的代码显示 20%。这有什么原因吗??
最佳答案
据我所知,运行时内存方法仅将 HEAP 报告为总计(因此所有值都是 old、eden、survivor 和 permanent 的总计)。这就是为什么您的值会关闭,因为没有 jstat 输出告诉您整体堆利用率。
关于 Runtime.freeMemory()
需要注意的一件事是它可能并不完全准确。来自方法的 javadoc:
返回当前可用于 future 分配对象的内存总量的近似值,以字节为单位。
我倾向于不信任从运行时类返回的关于内存的任何值。使用 jconsole 或 jstat 等外部命令获取内存统计信息,或者在启动 java 程序时使用 -Xloggc
。这些方法在监控内存使用方面比我见过的任何 API 方法都可靠得多。
关于Java 内存 : jstat vs Runtime. getRuntime().freeMemory();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13987537/