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

Java内存:jstat vs Runtime.getRuntime().freemory();,java,jakarta-ee,memory,memory-management,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 EOp YGC YGCT FGC FGCT GCT 2849

我正在运行一个java应用程序,我观察到如下情况:

我通过代码计算内存利用率:

long freeMemory = Runtime.getRuntime().freeMemory();
this.memUsage = 100f - (freeMemory*100)/this.maxMemory;
where
instance.maxMemory = Runtime.getRuntime().maxMemory();
时间戳S0 S1 EOp YGC YGCT FGC FGCT GCT

2849.6 0.00 84.80 93.1416.9560.00 483 140.140 8 3.649 143.789

首先,我的代码将显示哪个内存。旧的,伊甸园还是幸存者。我认为旧的..m I rgt

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

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

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

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

我倾向于不信任运行时类返回的关于内存的任何值。使用jconsole或jstat等外部命令获取内存统计信息,或者在启动java程序时使用
-Xloggc
。这些方法在监视内存使用方面比我见过的任何API方法都要可靠得多