无法在运行时使用freeMemory方法获取对象大小

时间:2015-10-03 19:16:22

标签: java jvm

我在eclipse中执行以下代码:

public static void main(String args[]) { 
  long before=Runtime.getRuntime().freeMemory();
  Object o=new Object();

  Long after=Runtime.getRuntime().freeMemory();
  System.out.println(before-after);
}

但我得到的输出是0。 我试图弄清楚为什么freeMemory方法在创建对象后没有减少堆空间?

3 个答案:

答案 0 :(得分:0)

尝试放入Runtime.getRuntime()。gc();在开始时你会看到一个变化

有关进一步说明,请参阅 Runtime - why is freeMemory() not showing memory consumed correctly?

答案 1 :(得分:0)

要测量对象大小,您应该使用jol

答案 2 :(得分:0)

Java / JVM是垃圾收集语言。内存分配和释放完全由垃圾收集器管理,当JVM通过Young Generation Garbage集合或Full Garbage集合时会发生这样的内存释放。它再次基于GC类型,您可以使用串行GC,并行GC等。

此外: 当JVM找到freeMemory()方法时,它只返回一个值,该值可用于分配新对象的JVM可用内存量,但不能调用释放或释放内存。

因此,freeMemory()方法对查找对象并释放它们没有任何影响。此外,在垃圾收集语言中,您无法直接释放任何特定对象的内存,但它只能通过垃圾收集调用发生。此外,某些类型的JVM(如CMS收集器)标记在下一个垃圾收集周期(年轻GC)中要释放的对象,前提是您的对象不是在收集发生之前提升到旧一代的终身对象。此类GC中的实际内存释放发生在其扫描阶段。阅读更多关于垃圾收集器类型,如串行GC,并行GC,CMS,G1GC,只有这样您才能了解在什么特定条件和JVM初始化设置 - 您可以期待垃圾收集调用和垃圾收集类型(年轻集合或完整GC集合) )被触发,释放分配的内存。