G1 concurrent refinement regression

Brian S O'Neill bronee at gmail.com
Sun Sep 28 16:19:11 UTC 2025


I'm observing an interesting regression between build 26-ea+16-1649 and 
build 26-ea+17-1764 with respect to concurrent refinement. I suspect the 
cause is JEP 522.

I ran a stress test in which GC pauses are about 25ms in the steady 
state. With 26-ea+16-1649, concurrent refinement is never initiated.

With 26-ea+17-1764 (JEP 522) concurrent refinement starts after the test 
has run for a few minutes. Eventually, concurrent refinement runs back 
to back forever, wasting a CPU core and affecting overall performance.

[244.479s][info][gc,start    ] GC(60) Pause Young (Normal) (G1 
Evacuation Pause)
[244.479s][info][gc,task     ] GC(60) Using 8 workers of 8 for evacuation
[244.501s][info][gc,phases   ] GC(60)   Pre Evacuate Collection Set: 0.19ms
[244.501s][info][gc,phases   ] GC(60)   Merge Heap Roots: 0.12ms
[244.501s][info][gc,phases   ] GC(60)   Evacuate Collection Set: 20.53ms
[244.501s][info][gc,phases   ] GC(60)   Post Evacuate Collection Set: 0.59ms
[244.501s][info][gc,phases   ] GC(60)   Other: 0.35ms
[244.501s][info][gc,heap     ] GC(60) Eden regions: 920->0(920)
[244.501s][info][gc,heap     ] GC(60) Survivor regions: 1->1(116)
[244.501s][info][gc,heap     ] GC(60) Old regions: 156->156
[244.501s][info][gc,heap     ] GC(60) Humongous regions: 9->9
[244.501s][info][gc,metaspace] GC(60) Metaspace: 
5499K(5952K)->5499K(5952K) NonClass: 4891K(5184K)->4891K(5184K) Class: 
608K(768K)->608K(768K)
[244.502s][info][gc          ] GC(60) Pause Young (Normal) (G1 
Evacuation Pause) 2167M->327M(3072M) 22.125ms
[244.502s][info][gc,cpu      ] GC(60) User=0.23s Sys=0.00s Real=0.02s
[248.721s][info][gc,refine,start] Concurrent Refine Cycle
[248.721s][info][gc,refine,start] Concurrent Refine Global Card Table Swap
[248.721s][info][gc,refine      ] Concurrent Refine Global Card Table 
Swap 0.029ms
[248.721s][info][gc,refine,start] Concurrent Refine Java Thread CT swap
[248.726s][info][gc,refine      ] Concurrent Refine Java Thread CT swap 
4.946ms
[248.726s][info][gc,refine,start] Concurrent Refine GC Thread CT swap
[248.726s][info][gc,refine      ] Concurrent Refine GC Thread CT swap 
0.050ms
[248.726s][info][gc,refine,start] Concurrent Refine Snapshot Heap
[248.726s][info][gc,refine      ] Concurrent Refine Snapshot Heap 0.076ms
[248.726s][info][gc,task        ] Concurrent Refine Sweep Using 1 of 8 
Workers
[248.726s][info][gc,refine,start] Concurrent Refine Table Step
[248.884s][info][gc,refine      ] Concurrent Refine Table Step 158.020ms
[248.884s][info][gc,refine,start] Concurrent Refine Complete Work
[248.884s][info][gc,refine      ] Concurrent Refine Complete Work 0.030ms
[248.884s][info][gc,refine      ] Concurrent Refine Cycle 163.510ms

And eventually:

[403.369s][info][gc,refine,start] Concurrent Refine Cycle
[403.369s][info][gc,refine,start] Concurrent Refine Global Card Table Swap
[403.369s][info][gc,refine      ] Concurrent Refine Global Card Table 
Swap 0.019ms
[403.369s][info][gc,refine,start] Concurrent Refine Java Thread CT swap
[403.371s][info][gc,refine      ] Concurrent Refine Java Thread CT swap 
1.910ms
[403.371s][info][gc,refine,start] Concurrent Refine GC Thread CT swap
[403.371s][info][gc,refine      ] Concurrent Refine GC Thread CT swap 
0.048ms
[403.371s][info][gc,refine,start] Concurrent Refine Snapshot Heap
[403.371s][info][gc,refine      ] Concurrent Refine Snapshot Heap 0.077ms
[403.371s][info][gc,task        ] Concurrent Refine Sweep Using 1 of 8 
Workers
[403.371s][info][gc,refine,start] Concurrent Refine Table Step
[403.601s][info][gc,refine      ] Concurrent Refine Table Step 229.866ms
[403.601s][info][gc,refine,start] Concurrent Refine Complete Work
[403.601s][info][gc,refine      ] Concurrent Refine Complete Work 0.022ms
[403.601s][info][gc,refine      ] Concurrent Refine Cycle 232.259ms
[403.601s][info][gc,refine,start] Concurrent Refine Cycle
[403.601s][info][gc,refine,start] Concurrent Refine Global Card Table Swap
[403.601s][info][gc,refine      ] Concurrent Refine Global Card Table 
Swap 0.015ms
[403.601s][info][gc,refine,start] Concurrent Refine Java Thread CT swap
[403.602s][info][gc,refine      ] Concurrent Refine Java Thread CT swap 
0.669ms
[403.602s][info][gc,refine,start] Concurrent Refine GC Thread CT swap
[403.602s][info][gc,refine      ] Concurrent Refine GC Thread CT swap 
0.047ms
[403.602s][info][gc,refine,start] Concurrent Refine Snapshot Heap
[403.602s][info][gc,refine      ] Concurrent Refine Snapshot Heap 0.079ms
[403.602s][info][gc,task        ] Concurrent Refine Sweep Using 1 of 8 
Workers
[403.602s][info][gc,refine,start] Concurrent Refine Table Step
[403.761s][info][gc,refine      ] Concurrent Refine Table Step 159.273ms
[403.761s][info][gc,refine,start] Concurrent Refine Complete Work
[403.761s][info][gc,refine      ] Concurrent Refine Complete Work 0.022ms
[403.761s][info][gc,refine      ] Concurrent Refine Cycle 160.341ms

The problem goes away when I set -XX:MaxGCPauseMillis=500 or higher. 
Considering that the pauses are always well below the 200ms default, I'm 
surprised that concurrent refinement occurs at all.






More information about the hotspot-gc-dev mailing list