我在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方法在创建对象后没有减少堆空间?
答案 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集合) )被触发,释放分配的内存。