在空间回收之后,收集周期从另一个young-only的阶段重新开始。作为备份,如果应用程序在收集存活信息时耗尽了内存,G1会像其他收集器一样执行就地stop-the-world的完全堆压缩(Full GC)。
G1内部细节 Java堆大小调整G1在调整Java堆大小时遵循标准规则,使用 -XX:InitialHeapSize 作为最小的 Java 堆空间, -XX:MaxHeapSize 作为最大的 Java 堆空间, -XX:MinHeapFreeRatio 作为最小的可用内存百分比, -XX:MaxHeapFreeRatio 用于确定调整大小后可用内存的最大百分比。 G1收集器仅在执行重标记(Remark) 和 Full GC 暂停期间考虑调整 Java 堆的大小。 这个过程可以从操作系统释放内存或分配内存。
Young-Only阶段代调整G1总是在下一个突变子阶段的正常年轻代回收结束时测量年轻代的大小。通过这种方式,G1可以满足使用 -XX:MaxGCPauseTimeMillis 和 -XX:PauseTimeIntervalMillis 设置的暂停时间目标,该目标基于对实际暂停时间的长期观察。它考虑到了同样规模的年轻代需要多长时间才能删除。这包括在回收过程中需要复制多少对象以及这些对象之间的互联程度等信息。
如果没有其他限制,那么 G1可以在 -XX:G1NewSizePercent 和 -XX:G1MaxNewSizePercent 确定的值之间自适应地调整年轻代大小,以满足暂停时间的要求。
或者,可以使用 -XX:NewSize 和 -XX:MaxNewSize 分别设置年轻代的最小值和最大值。
注意: 只指定后面这些选项中的一个,就可以将年轻代大小精确地固定为分别使用 -XX:NewSize 和 -XX:MaxNewSize 传递的值。这将禁用暂停时间控制。
空间回收阶段的代调整在空间回收阶段,G1试图在一次垃圾回收暂停中最大化在老年代中回收的空间量。 年轻年代的大小设置为允许的最小值,通常由-XX:G1NewSizePercent 确定。
周期性的垃圾收集
如果由于应用程序不活跃而导致长时间没有垃圾收集,那么虚拟机可能会长时间保留大量未使用的内存,这些内存可以在其他地方使用。
为了避免这种情况,可以强制 G1使用 -XX:G1PeriodicGCInterval 选项执行常规垃圾收集。此选项确定 G1考虑执行垃圾回收的最小间隔(毫秒)。
如果自以前任何垃圾收集暂停以来已经过去了这段时间,并且没有正在进行的并发循环,G1将触发额外的垃圾回收。
确定初始堆占用率启动堆占用百分比(Initiating Heap Occupancy Percent, IHOP)是触发初始标记回收的阈值,它被定义为老年代大小的百分比。
默认情况下,G1通过在标记周期中观察标记需要多长时间以及在老年代中通常分配多少内存来自动确定最佳IHOP。这个特性称为自适应IHOP。
如果这个特性是活动的,那么选项 -XX:InitiatingHeapOccupancyPercent 确定初始值作为当前老年代代大小的百分比,只要没有足够的观测值来很好地预测启动堆占用阈值。
使用 -XX:-G1UseAdaptiveIHOP 选项关闭 G1的此行为。 在这种情况下, -XX:InitiatingHeapOccupancyPercent 的值总是决定这个阈值。
标记G1标记使用一种称为“初始快照”(Snapshot-At-The-Beginning,SATB)的算法。 它在初始标记暂停时拍摄堆的虚拟快照,此时所有在标记开始时处于活动状态的对象都被认为在标记的剩余时间处于活动状态。这意味着,为了空间回收的目的(除了一些例外) ,在标记期间变为死的(不可到达的)对象仍然被认为是活的。与其他收集器相比,这可能会导致一些额外的内存被错误地保留。但是,SATB 可能在Remark暂停期间提供更好的延迟。在这个标记期间过于保守地考虑活动对象将在下一个标记期间被回收。
-XX:MaxGCPauseMillis=200 最大暂停时间的目标
-XX:GCPauseTimeInterval= 最大暂停时间间隔的目标。 默认情况下,G1不设置任何目标,允许 G1在极端情况下背靠背地执行垃圾收集。
-XX:ParallelGCThreads= 垃圾回收暂停期间用于并行工作的最大线程数。 这是根据虚拟机以下列方式运行的计算机的可用线程数得出的: 如果进程可用的 CPU 线程数少于或等于8,则使用该线程。否则,使用线程数的5/8。
-XX:ConcGCThreads=
-XX:+G1UseAdaptiveIHOP -XX:InitiatingHeapOccupancyPercent=45
-XX:G1HeapRegionSize=
-XX:G1NewSizePercent=5 -XX:G1MaxNewSizePercent=60
-XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=8
-XX:G1MixedGCLiveThresholdPercent=85
与其它收集器的比较####### 这是G1与其他收集器之间主要区别的摘要:
并行 GC 只能作为一个整体压缩和回收老年代中的空间。
G1增量地将这些工作分配到多个更短的回收中。这大大缩短了暂停时间,但是却降低了吞吐量。
G1并发执行部分老年代空间回收。
G1可能比上述收集器显示更高的开销,由于并发性而影响吞吐量。
ZGC针对非常大的堆,目的是以更高的吞吐量成本提供更小的停顿时间。
由于它的工作原理,G1有一些独特的机制来提高垃圾回收效率: