Java 内存 : jstat vs Runtime. getRuntime().freeMemory();

标签 java jakarta-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

首先,我的代码将显示哪个内存。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/

相关文章:

java - 关于创建类数组的困惑

java - 有什么方法可以将字符串中的第一个单词转换为驼峰格式吗?

java - 如何在 jsp 文件中的查询语句中使用从 servlet 检索的数据?

java - EJB 注入(inject)不起作用

c - 尝试访问结构中的空指针时出现段错误

javascript - Node.js 中 process.nextTick 的正确用例是什么?

linux - 无法访问 GDB 中 [vvar] 内存区域的内容?

java - 读取 JAR 文件外部的属性文件 - java 8 无法识别文件

Java : 80 bit number ( looking for nice approach )

java - 如何在java中的二叉搜索树中插入节点和值?