4

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

4

3 回答 3

2

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

来自:Java® 虚拟机规范,Java SE 7 版:2.5.3。堆

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

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

于 2013-05-17T11:59:37.587 回答
2

你是手动运行的System.gc()吗?因为不能保证立即(甚至根本不)实际进行垃圾收集。

对于自动垃圾收集,我假设 JVM 确定进行垃圾收集的好时机是相同的。

于 2013-05-17T11:44:11.263 回答
1

Java Hotspot VM没有实现确定性 GC算法。

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

  • 节拍器 GC (IBM VM)
  • 东亚银行
  • Azul 的无休止垃圾收集器
  • FijiVM 及其分裂:分片容忍实时垃圾收集
于 2013-05-17T21:47:30.700 回答