RFR: 8071277: G1: Merge commits and uncommits of contiguous memory
Albert Mingkun Yang
ayang at openjdk.org
Mon Sep 22 07:28:16 UTC 2025
On Fri, 19 Sep 2025 07:01:00 GMT, Thomas Schatzl <tschatzl at openjdk.org> wrote:
> Hi all,
>
> please review this change to G1 commit/uncommit to merge commit/uncommit calls to the operating system as much as possible. This significantly improves startup performanc
>
> Performance results before/after on Zen3 processor for a "HelloWorld" application:
>
>
> $ hyperfine -w 10 -r 10 "baseline/bin/java -XX:+UseG1GC -Xms128m -Xmx128m Hello"
> Benchmark 1: baseline/bin/java -XX:+UseG1GC -Xms128m -Xmx128m Hello
> Time (mean ± σ): 16.4 ms ± 0.4 ms [User: 11.0 ms, System: 14.4 ms]
> Range (min … max): 15.7 ms … 16.8 ms 10 runs
>
> $ hyperfine -w 10 -r 10 "baseline/bin/java -XX:+UseG1GC -Xms2g -Xmx2g Hello"
> Benchmark 1: baseline/bin/java -XX:+UseG1GC -Xms2g -Xmx2g Hello
> Time (mean ± σ): 24.7 ms ± 0.4 ms [User: 10.7 ms, System: 22.7 ms]
> Range (min … max): 24.2 ms … 25.4 ms 10 runs
>
> My reimplementation of JDK-8071277 does show improvements here:
>
> $ hyperfine -w 10 -r 10 "changes/bin/java -XX:+UseG1GC -Xms128m -Xmx128m Hello"
> Benchmark 1: changes/bin/java -XX:+UseG1GC -Xms128m -Xmx128m Hello
> Time (mean ± σ): 15.9 ms ± 0.4 ms [User: 11.9 ms, System: 13.1 ms]
> Range (min … max): 15.4 ms … 16.7 ms 10 runs
>
> $ hyperfine -w 10 -r 10 "changes/bin/java -XX:+UseG1GC -Xms2g -Xmx2g Hello"
> Benchmark 1: changes/bin/java -XX:+UseG1GC -Xms2g -Xmx2g Hello
> Time (mean ± σ): 19.7 ms ± 0.3 ms [User: 11.3 ms, System: 17.4 ms]
> Range (min … max): 19.2 ms … 20.1 ms 10 runs
>
>
> I.e., depending on actually committed heap size (`-Xms`), reduction of startup time by 20% or so in above cases.
>
> Testing: tier1-5, gha
>
> Thanks,
> Thomas
src/hotspot/share/gc/g1/g1RegionToSpaceMapper.cpp line 247:
> 245: }
> 246: };
> 247: RangeApplicator range(commit_range);
The use of higher-order-function here makes the code/flow a bit harder to follow. If the goal is to identify consecutive committed/uncommitted regions, I wonder if one do sth like:
for (size_t page = start_page; page <= end_page; /* empty */) {
uncommitted_l = find_first_uncommitted();
uncommitted_r = find_first_committed();
commit_range(uncommitted_l, uncommitted_r);
page = uncommitted_r + 1;
}
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/27381#discussion_r2366961486
More information about the hotspot-gc-dev
mailing list