我在具有相同JVM参数的Java产品上运行同一场景的多次运行。每次运行都会在持续时间和“开始时间”方面提供不同的GC行为。这是预期的吗?
答案 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中: