In JDK 17 G1 added "preventive" garbage collections (GCs): these are speculative garbage collections, with the goal of avoiding costly evacuation failures due to allocation bursts when the heap is almost full.
However, these (speculative) collections have the consequence of additional garbage collection work - as object aging is based on number of GCs with additional GCs cause premature promotion into the old generation - which leads to more data in the old generation, and more garbage collection work to remove these objects. This has been compounded by the current prediction to trigger preventive garbage collections being very conservative; which means these garbage collections are often triggered unnecessarily.
In the majority of cases this feature is a net loss, and as evacuation failures are now handled more quickly, there is no longer any reason for this feature and it has been disabled by default, it may be re-enabled by `-XX:+UnlockDiagnosticVMOptions -XX:+G1UsePreventiveGC`.