RFR: 8271884: G1CH::_expand_heap_after_alloc_failure is no longer needed
Thomas Schatzl
tschatzl at openjdk.java.net
Tue Aug 10 20:28:25 UTC 2021
On Fri, 6 Aug 2021 10:43:19 GMT, Ivan Walulya <iwalulya at openjdk.org> wrote:
> Hi,
>
> Please review this change to remove _expand_heap_after_alloc_failure. Checks for old_is_full(), survivor_is_full(), and G1CollectedHeap::has_more_regions() should eliminate repeated expansion attempts.
>
> Testing; tier 1
Changes requested by tschatzl (Reviewer).
src/hotspot/share/gc/g1/g1CollectedHeap.cpp line 167:
> 165: HeapRegion* res = _hrm.allocate_free_region(type, node_index);
> 166:
> 167: if (res == NULL && do_expand) {
Ivan and me were looking into any adverse impact when removing this, in particular the expansion being called very often without `_expand_heap_after_alloc_failure`.
There is indeed an issue with convoying in both the survivor and old gen region allocation; the code that ultimately calls down here looks like the following:
if (result == NULL && !old_is_full()) {
MutexLocker x(FreeList_lock, Mutex::_no_safepoint_check_flag);
result = old_gc_alloc_region()->attempt_allocation_locked(min_word_size,
desired_word_size,
actual_word_size);
if (result == NULL) {
set_old_full();
}
}
```
(likewise for survivor allocation)
After the first check to `old_is_full()` we get the `FreeList_lock` and after that call down to the allocation. This is actually the problem: multiple threads can be waiting for the lock trying to allocate, and all of these waiters will be able to try to expand without that `_expand_heap_after_alloc_failure` flag.
The solution is to check `old_is_full()` after grabbing the lock again - which is actually better than only finding out here quite late that there is nothing to allocate.
-------------
PR: https://git.openjdk.java.net/jdk/pull/5030
More information about the hotspot-gc-dev
mailing list