我目前使用以下代码在我的应用程序中打印出内存使用信息:
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正在运行。
答案 0 :(得分:1)
Toral memory是:
为java进程保留的总分配空间。
另见答案:What is runtime total memory ?
但是,任务管理器会报告机器中JVM消耗的总内存。
任务管理器报告操作系统(本例中为Windows)已分配给运行JVM的Windows进程的内存,而Runtime.getTotalMemory()报告分配给运行执行该方法的线程的当前java进程的总内存。 对于每个线程,Runtime是一个“
的实例PS:如果你在IDE这样的IDE中运行程序,你可能会发现很大的不同,因为操作系统会报告IDE消耗的总内存(Eclipse是一个java程序)加上生成运行java程序的JVM所消耗的内存。 Eclipse可以启动不同的JVM实例来运行程序。因此,在eclipse使用的衍生JVM中运行Runtime会报告其内部的总内存。“每个Java应用程序都有一个Runtime类实例,它允许应用程序与运行应用程序的环境进行交互。当前运行时可以从getRuntime方法获得。” Runtime Javadoc