【发布时间】:2013-06-26 19:39:57
【问题描述】:
那里有类似的问题,但他们似乎避免回答这个具体问题。如何通过 Java 的 Runtime api 获取 我的 Java 程序 使用的内存?
答案here表明我可以这样做:
System.out.println("KB: " + (double) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
但是无论我运行哪个程序,这总是返回相同的数字。例如,下面我有一个程序,无论我在地图中输入多少数字,内存使用量都保持不变。
package memoryTest;
import java.util.HashMap;
import java.util.Map;
public class MemoryTest {
static Map<Integer, NewObject> map = new HashMap<Integer, NewObject>();
public static void main(String[] args){
System.out.println("KB: " + (double) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
fillMemory(25);
System.out.println("KB: " + (double) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
}
static int j=0;
public static void fillMemory(int i){
for(int k=0; k< 2000; k++)
map.put(j++, new NewObject());
}
public static class NewObject{
long i = 0L;
long j = 0L;
long k = 0L;
}
}
通过cambecc的main方法,输出为:
3085,总计:128516096,免费:127173744,差异:671120
173579,总计:128516096,免费:110033976,差异:671128
335207,总计:128516096,免费:92417792,差异:637544
672788,总计:224198656,免费:159302960,差异:1221520
1171480,总计:224198656,免费:106939136,差异:1221544
1489771,总计:368377856,免费:227374816,差异:1212984
1998743,总计:368377856,免费:182494408,差异:1212984
【问题讨论】:
-
getRuntime().totalMemory()指的是 Java 运行时可用的内存总量,而不是具体的应用程序可用的内存量。 -
@Robert Harvey 我已编辑。由于某种原因,提供的答案对我不起作用...
-
我重新打开了,但也许你误解了我的意思。
getRuntime().totalMemory不会为你想做的事情工作。 -
谢谢。是的我明白。我上面引用的答案似乎表明它会。
-
@RobertHarvey:澄清一下,你为什么说
totalMemory不适合@MattB?按照目前的措辞来看这个问题,@MattB 想要测量在单个 JVM 实例上运行的 Java 程序的内存使用情况。对于这种情况,totalMemory - freeMemory是正确的。totalMemory的结果不受在同一台机器上运行的其他 JVM 实例(即进程)的影响。并且@MattB 没有提及在与他的程序相同的 JVM 实例中运行的其他程序。totalMemory怎么不对?