2015-10-03 41 views
0

我在Eclipse中执行以下代码使用freeMemory方法获取对象大小:无法在运行时

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方法是不降低对象创建后堆空间?

+0

可能重复的[运行时 - 为什么是freeMemory()没有显示内存消耗正确?](http://stackoverflow.com/questions/3421869/runtime-why-is-freememory-not-showing-memory-consumed-正确) – Roman

回答

0

来衡量你应该使用jol对象大小。

0

Java/JVM是一种垃圾收集语言。内存分配和释放完全由垃圾收集器管理,当JVM通过年轻一代垃圾收集或完全垃圾收集时,会发生这样的内存释放。它再次基于GC类型,如串行GC,并行GC等。

此外: 当JVM找到freeMemory()方法时,它只返回一个值,表示新的对象有多少JVM空闲内存可用被分配但不是呼叫释放或释放内存。

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