java运行时为什么freeMemory()不能正确显示内存消耗情况?
下面是检查内存的代码片段
public class TestFreeMemory {
public static void main(String ... args){
Runtime rt = Runtime.getRuntime();
System.out.println("Free Memory (Before GC): " + rt.freeMemory());
rt.gc();
System.out.println("Free Memory (After GC1): " + rt.freeMemory());
rt.gc(); // Second time to ensure results are consistent
// MAY BE has collected all non-reachable objects
System.out.println("Free Memory (After GC2): " + rt.freeMemory());
String s = new String("abcd");
Integer i = new Integer(12345);
System.out.println("Free Memory (After String Creation): " + rt.freeMemory());
// Why is freeMemory not reflecting the memory consumed by two objects
}
}
输出是
Free Memory (Before GC): 1859672
Free Memory (After GC1): 1911768
Free Memory (After GC2): 1911768
Free Memory (After String Creation): 1911768
为什么freeMemory不能反映两个对象消耗的内存
更清楚地说,问题是getMemory()调用没有显示预期的结果,即使创建了两个与GC无关的对象。进行两次GC调用只是为了确保getMemory()调用的数目正确。。顺便说一句,创建对象后没有GC调用。。所以请注意,我不是在创建对象后尝试GC
# 1 楼答案
这是一个很好的问题,因为你期待内存使用量的增加,这似乎是一个合乎逻辑的测试。您可以假设这种行为是因为堆管理和垃圾收集系统比简单的空闲和分配边界要复杂一些。分配可能是以比一个字符串+一个整数大得多的块来完成的,所以空闲内存很可能是通过对空闲块求和来计算的
# 2 楼答案
试着分配更多的内存,你会看到内存的增加。我猜java至少预先分配了足够的字节(多聪明!)或者他们已经在弦池里了