2012-04-26 34 views
1

我想计算我的Java应用程序的当前内存使用情况。但是,当我使用以下代码时,与任务管理器中显示的内容有很大差异。Java:计算内存使用率时的结果不准确

Runtime rt = Runtime.getRuntime(); 
long usedMemory = (rt.totalMemory() - rt.freeMemory())/1024; 

根据任务管理器,当进程消耗3.000.000K时,该代码将例如,计算2.015.203和1秒后1.712.296,实际上内存使用量增加了。

根据类似的问题,代码应该没问题,但为什么与任务管理器相比有如此巨大的差别?

+0

JVisualVM报告是什么 - 它与TaskManager有什么不同? – 2012-04-26 23:46:59

+0

你在任务管理器中查看了哪些列?有很多内存列。 – 2012-04-26 23:49:50

+0

你为什么想知道?这不是一个轻浮的问题。 Java是一个高度复杂的托管环境,在几乎所有情况下,您都不应该通过询问操作系统来尝试为其制定流程管理决策。 – kittylyst 2012-04-27 03:12:18

回答

6

TaskManager会告诉您java进程(JVM)的所有可用内存。

在内部,JVM根据程序需求来管理此内存(所以,JVM中有“空闲”的内存,但它显示为用于TaskMan)。

此外,GC在决定最有用时释放内存。因此,在创建更多对象之后很有可能使用的内存更少,因为GC已经扫过先前分配的内存(但无法访问)。