我正在运行一个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
2849.6 0.00 84.80 93.14 16.95 60.00 483 140.140 8 3.649 143.789
首先,我的代码将显示哪个memory.Old,伊甸园还是幸存者。
在特定的时候,我观察到我的代码给了我与jstat旧内存利用率不同的输出。就像这里,jstat旧的显示大约17 %,我的代码显示20%。有什么原因吗??
发布于 2013-01-01 14:29:33
据我所知,运行时内存方法只将堆报告为总计(因此所有的值都是旧的、伊甸园的、幸存者的和永久的)。这就是关闭值的原因,因为没有jstat输出来告诉您总的堆利用率。
关于Runtime.freeMemory(),有一点要注意的是,它可能并不完全准确。来自方法的javadoc:
返回以字节为单位的用于未来分配对象的当前可用内存总量的近似。
我倾向于不信任Runtime类返回的关于内存的任何值。或者使用j控制台或jstat这样的外部命令获取内存统计数据,或者在启动java程序时使用-Xloggc。对于监视内存使用情况,这些方法比我见过的任何API方法都更可靠。
https://stackoverflow.com/questions/13987537
复制相似问题