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

Java 无法在运行时使用freeMemory方法获取对象大小,java,jvm,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。 我正在试图弄清楚为什么freeM

我正在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方法在创建对象后不减少堆空间?

尝试放置Runtime.getRuntime().gc();一开始,你会看到一个变化

有关更多说明,请参阅

测量对象大小时应使用。

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

此外: 当JVM找到freeMemory()方法时,它只返回一个值,该值表示有多少JVM空闲内存可供分配给新对象,而不是一个释放内存的调用

所以,freeMemory()方法在查找对象并释放它们时没有效果。此外,在垃圾收集语言中,您无法直接释放任何特定对象的内存,但只能通过抓取收集调用来实现。此外,某些类型的JVM(如CMS收集器)会在下一个垃圾收集周期(年轻的GC)中标记要释放的对象,前提是您的对象不是在收集发生之前升级到旧一代的永久对象。这种GC中的实际内存释放发生在其扫描阶段。阅读有关垃圾收集器类型(如串行GC、并行GC、CMS、G1GC)的更多信息,只有这样,您才能了解在什么特定条件和JVM初始化设置下—您可能需要垃圾收集调用和垃圾收集类型(年轻收集或完全GC收集)正在触发,释放已分配的内存。

可能重复的