通过运行时对象与任务管理器输出的Java内存使用情况

时间:2018-02-22 19:29:42

标签: java memory-leaks heap-memory

我目前使用以下代码在我的应用程序中打印出内存使用信息:

Runtime runtime = Runtime.getRuntime();

NumberFormat format = NumberFormat.getInstance();

long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();

errorLog.warn("free memory: " + format.format(freeMemory / 1024));
errorLog.warn("allocated memory: " + format.format(allocatedMemory / 1024));
errorLog.warn("max memory: " + format.format(maxMemory / 1024));
errorLog.warn("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));

输出看起来如下:

Free Memory: 3,471K
Allocated Memory: 29,572K
Max Memory: 253,440K
Total Free Memory: 227,339K

这与我在JVM的任务管理器中使用的内容有何关系,即98,768K?这是我第一次使用Runtime类并检查这些值。在我编写的应用程序中查找可能的内存问题。我看到Task Mgr值随时间缓慢增加,但Runtime类项没有。虽然最终任务经理的价值会急剧下降,我猜是GC正在运行。

1 个答案:

答案 0 :(得分:1)

Toral memory是:

  

为java进程保留的总分配空间。

另见答案:What is runtime total memory ?

但是,任务管理器会报告机器中JVM消耗的总内存。

任务管理器报告操作系统(本例中为Windows)已分配给运行JVM的Windows进程的内存,而Runtime.getTotalMemory()报告分配给运行执行该方法的线程的当前java进程的总内存。 对于每个线程,Runtime是一个“

的实例
  

“每个Java应用程序都有一个Runtime类实例,它允许应用程序与运行应用程序的环境进行交互。当前运行时可以从getRuntime方法获得。”   Runtime Javadoc

PS:如果你在IDE这样的IDE中运行程序,你可能会发现很大的不同,因为操作系统会报告IDE消耗的总内存(Eclipse是一个java程序)加上生成运行java程序的JVM所消耗的内存。 Eclipse可以启动不同的JVM实例来运行程序。因此,在eclipse使用的衍生JVM中运行Runtime会报告其内部的总内存。