是Java GC确定性的吗?

时间:2013-05-17 11:41:10

标签: garbage-collection jvm

我在具有相同JVM参数的Java产品上运行同一场景的多次运行。每次运行都会在持续时间和“开始时间”方面提供不同的GC行为。这是预期的吗?

3 个答案:

答案 0 :(得分:2)

您是否手动运行System.gc()?因为不能保证立即(或甚至根本没有)实际进行垃圾收集。

对于自动垃圾收集,我认为它与JVM确定进行垃圾收集的好时机相同。

答案 1 :(得分:2)

Java VM规范未指定应如何实现垃圾收集。所以你不能假设任何确定性行为。

来自:The Java® Virtual Machine Specification, Java SE 7 Edition: 2.5.3. Heap

  

在虚拟机启动时创建堆。对象的堆存储由自动存储管理系统(称为垃圾收集器)回收;对象永远不会被显式释放。 Java虚拟机假设没有特定类型的自动存储管理系统,可以根据实现者的系统要求选择存储管理技术。堆可以具有固定大小,或者可以根据计算的需要进行扩展,并且如果不需要更大的堆,则可以收缩。堆的内存不需要是连续的。

总结:是的,你观察到的行为是正常的,可以预期的。

答案 2 :(得分:2)

Java 热点 VM 未实施确定性GC 算法。

一般来说,Java确实存在确定性GC算法。例如,在以下JVM中:

  • Metronome GC(IBM VM)
  • BEA JRockit
  • Azul的Pauseless Garbage Collector
  • FijiVM及其分裂:容易碎片的实时垃圾收集