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