垃圾回收和堆扩展

垃圾回收和堆扩展是 JVM 操作的必要部分。 JVM 中垃圾回收的频率受 JVM 中运行的应用程序所创建的垃圾(或对象)数量的影响。

分配失败

当 JVM 耗尽存储堆中的空间并且无法再分配任何对象 (分配失败) 时,将触发垃圾回收。 垃圾回收器将清除存储堆中不再由应用程序引用的对象,并释放部分空间。 在垃圾回收周期期间,垃圾回收会阻止所有其他进程在 JVM 中运行,因此垃圾回收所花费的时间是不用于运行应用程序的时间。 有关 JVM 垃圾回收过程的详细说明,请参阅 分代并发垃圾回收器

当分配失败触发垃圾回收,但垃圾回收没有释放足够空间时,垃圾收集器会扩展存储堆。 在堆扩展期间,垃圾收集器从为堆保留的最大存储量 ( -Xmx 选项指定的存储量) 获取存储量,并将其添加到堆的活动部分 (以 -Xms 选项指定的大小开始)。 堆扩展不会增加 JVM 所需的存储量,因为 -Xmx 选项指定的最大存储量已在启动时分配给 JVM。 如果 -Xms 选项的值在堆的活动部分为应用程序提供了足够的存储空间,那么垃圾收集器完全不必执行堆扩展。

在 JVM 生存期的某个时刻,垃圾回收器停止扩展存储堆,因为堆已达到垃圾回收器对垃圾回收频率和进程释放的空间量感到满意的状态。 垃圾回收器并不旨在消除分配失败,因此在垃圾回收器停止扩展存储堆之后,某些垃圾回收仍可由分配失败触发。 根据您的性能目标,您可能认为此垃圾回收频率过高。

垃圾回收选项

您可以对垃圾回收使用不同的策略,这些策略会在应用程序和整个系统的吞吐量与垃圾回收所导致的暂停时间之间进行权衡。 垃圾回收由 -Xgcpolicy 选项控制:

-Xgcpolicy:optthruput
此策略向应用程序提供高吞吐量,但在发生垃圾回收时,将以偶尔暂停为代价。
-Xgcpolicy:gencon
此策略有助于最大程度地缩短在任何垃圾回收暂停中所花费的时间。 将此垃圾回收策略与 JVM 服务器配合使用。 您可以通过查询 JVMSERVER 资源来检查 JVM 服务器正在使用的策略。 JVM 服务器统计信息包含一些字段,用于告诉您发生的主要和次要垃圾回收事件的数量以及在垃圾回收上花费的处理器时间。

使用此策略时,如果系统具有大堆并且对响应时间敏感,那么还需要考虑 -Xgc:concurrentScavenge 设置 (这不是缺省设置)。 在这些情况下,它可以帮助减少垃圾回收暂停时间。 更多信息,请参阅 -Xgc:concurrentScavenge

-XX:+HeapManagementMXBeanCompatibility
如果使用的是 Java™ 8 SR5 及更高版本,那么缺省情况下会设置此策略。 此策略确保垃圾回收统计信息与先前级别的 Java 一致。 更多信息,请参阅 +|-]HeapManagementMXBeanCompatibility
-XX:-HeapManagementMXBeanCompatibility
您可以选择选择使用此策略。 此策略在 Java 8 SR5 及更高版本中启用缺省堆更改,但是在某些情况下,垃圾回收统计信息可能指示堆使用率大于最大堆大小。 更多信息,请参阅 +|-]HeapManagementMXBeanCompatibility

您可以通过更新 JVM 概要文件来更改垃圾回收策略。 有关所有垃圾回收选项的详细信息,请参阅 在 IBM SDK 中指定垃圾回收策略