【发布时间】:2020-06-26 11:17:59
【问题描述】:
我打算使用getRuntime().freeMemory() 粗略估计java 方法消耗了多少内存。我试图通过以下方式实现它:
long beforeUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
foo();
long afterUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
long actualMemUsed=afterUsedMem-beforeUsedMem;
为了测试这是否真的可行,我运行了下面的代码
long beforeUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
List<Integer> list = new ArrayList<>();
for(int i = 0 ;i<1000;i++)
list.add(i);
long afterUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
long actualMemUsed=afterUsedMem-beforeUsedMem;
System.out.println("mem used "+actualMemUsed);
但是,程序的输出结果是
mem used 0
但是,如果我从 0 -> 100000 循环,输出结果是
mem used 2684368
谁能解释一下为什么 jvm 会这样工作?
【问题讨论】:
-
Total 和 free 相等,所以结果为 0。然后你使用了一些内存,所以值不再是 0?
-
@MissingSemiColon 为什么我添加到列表后可用内存相同?
-
总内存 = 10.000.000,可用内存 = 10.000.000 使用内存后:总内存 = 10.000.000,可用内存 = 8.000.000 stackoverflow.com/questions/3571203/…。不能说我也不希望它为 0,但这是我能想到的唯一合乎逻辑的解释。
-
垃圾收集可以在任何时间点进行。此外,在代码执行开始时,可能已经存在任意数量的可回收垃圾。因此,差异是任意且毫无意义的。这个数字甚至可以是负数,例如当预先存在的垃圾占用的内存比代码中分配的对象多时。