RFR: 8338977: Parallel: Improve heap resizing heuristics [v3]
Albert Mingkun Yang
ayang at openjdk.org
Mon May 19 06:10:43 UTC 2025
On Sun, 18 May 2025 17:21:40 GMT, Guoxiong Li <gli at openjdk.org> wrote:
> so that we can do the check after all the GCs
Well, not really. In the old impl, `GCOverheadChecker::check_gc_overhead_limit` calls `set_gc_overhead_limit_exceeded` only for full-gc.
> But now you only use check_gc_overhead_limit in ParallelScavengeHeap::satisfy_failed_allocation. I suspect whether it can check the gc overhead limit accurately.
I believe so. In the old impl, we don't check gc-overhead for explicit gcs. Only allocation-failure caused gcs are interesting, which all go through `satisfy_failed_allocation`.
// Ignore explicit GC's. Exiting here does not set the flag and
// does not reset the count.
if (GCCause::is_user_requested_gc(gc_cause) ||
GCCause::is_serviceability_requested_gc(gc_cause)) {
return;
}
> src/hotspot/share/gc/parallel/psYoungGen.cpp line 268:
>
>> 266: size_t original_committed_size = virtual_space()->committed_size();
>> 267:
>> 268: while (true) {
>
> The `while` statement only runs once. May we find a better way to refactor the code?
I don't see an easy to re-structure the code while keeping all the relevant logic in the current context. I added some comments; check if it makes the flow easier to follow.
> src/hotspot/share/gc/parallel/psYoungGen.cpp line 334:
>
>> 332: assert(from_space()->capacity_in_bytes() == to_space()->capacity_in_bytes(), "inv");
>> 333: const size_t current_survivor_size = from_space()->capacity_in_bytes();
>> 334: assert(max_gen_size() > 2 * current_survivor_size, "inv");
>
> Should this assertion be changed to `assert(max_gen_size() > current_eden_size + 2 * current_survivor_size, "inv");` ?
Revised; needs to be `>=` though.
> src/hotspot/share/gc/parallel/psYoungGen.cpp line 379:
>
>> 377: // We usually resize young-gen only after a successful young-gc. However, in emergency state, we wanna expand young-gen to its max-capacity.
>> 378: // Young-gen should be empty normally after a full-gc.
>> 379: if (eden_space()->is_empty() && to_space()->is_empty()) {
>
> Why don't you test the `from space` here? And actually, if the `eden space` is empty, the `from space` and `to space` are empty too, because the objects are firstly moved to `eden space`. See the method `PSParallelCompact::summary_phase` for more information. So here, you only need to test whether the `eden space` is empty.
Added checking for `from_space`.
If all live-objs don't fit in old-gen, leftovers will be kept in its own space.
// Summarize the remaining spaces in the young gen. The initial target space
// is the old gen. If a space does not fit entirely into the target, then the
// remainder is compacted into the space itself and that space becomes the new
// target.
> src/hotspot/share/gc/parallel/psYoungGen.cpp line 487:
>
>> 485:
>> 486: void PSYoungGen::resize_spaces(size_t requested_eden_size,
>> 487: size_t requested_survivor_size) {
>
> You remove some `trace` level logs in this method. Please confirm whether it is your intent?
Yes; when testing/developing, I don't find them to be very useful.
> src/hotspot/share/gc/shared/adaptiveSizePolicy.hpp line 48:
>
>> 46: // Default: 100ms.
>> 47: static constexpr double MinGCDistanceSecond = 0.100;
>> 48: static_assert(MinGCDistanceSecond >= 0.001, "inv");
>
> The`MinGCDistanceSecond` is just a contant; the static assertion seems unnecessary?
It's more to convey the intend that this number have a lower bound if future changes want to lower it.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/25000#discussion_r2094893944
PR Review Comment: https://git.openjdk.org/jdk/pull/25000#discussion_r2094867831
PR Review Comment: https://git.openjdk.org/jdk/pull/25000#discussion_r2094870461
PR Review Comment: https://git.openjdk.org/jdk/pull/25000#discussion_r2094882156
PR Review Comment: https://git.openjdk.org/jdk/pull/25000#discussion_r2094882750
PR Review Comment: https://git.openjdk.org/jdk/pull/25000#discussion_r2094883781
More information about the hotspot-gc-dev
mailing list