RFR: 8335126: Shenandoah: Improve OOM handling

Kelvin Nilsen kdnilsen at openjdk.org
Wed Jun 26 17:59:17 UTC 2024


1. Throw OOM after failed allocation request following a Full GC (rather
   than retrying as long as Full GC makes good progress because
   repeatedly retrying the allocation request creates brown-out behavior
   with no identified benefits on real-world workloads)

2. Count a successful allocation following a blocking
   handle_allocation_failure() request to be good GC progress.
   Otherwise, we increment gc_no_progress_count in full GCs that
   have bad progress but successful allocations, and this causes
   unwanted failure to even try a full GC in a different thread after
   an out-of-memory condition might have been resolved in this thread.

3. Count a completed concurrent GC cycle as good progress, regardless
   of how much memory it might have been able to reclaim.  The fact that
   concurrent GC succeeded without allocation failure and without
   degeneration is considered good progress.  Successful concurrent
   GCs between Full GCs will reset the gc_no_progress_count to zero.

4. Do not count degenerated cycles as having no-progress.  If a
   degenerated cycle has no progress, it will upgrade to full GC.
   The upgraded full GC will evaluate its own progress.  We don't
   want to count this "same [upgraded] cycle" twice.

These changes have been tested over a variety of workloads and standard tests.  These changes have also been tested with the generational mode of Shenandoah.  It appears these changes provide more robust and consistent handling across a diversity of scenarios than the original implementation.

-------------

Commit messages:
 - Improve OOM handling
 - Merge branch 'openjdk:master' into master
 - Revert "Make GC logging less verbose"
 - Make GC logging less verbose
 - Merge branch 'openjdk:master' into master
 - Merge branch 'openjdk:master' into master
 - Merge branch 'openjdk:master' into master
 - Merge branch 'openjdk:master' into master
 - Merge branch 'openjdk:master' into master
 - Merge branch 'openjdk:master' into master
 - ... and 10 more: https://git.openjdk.org/jdk/compare/c66f785f...439d394c

Changes: https://git.openjdk.org/jdk/pull/19912/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=19912&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8335126
  Stats: 47 lines in 3 files changed: 27 ins; 1 del; 19 mod
  Patch: https://git.openjdk.org/jdk/pull/19912.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/19912/head:pull/19912

PR: https://git.openjdk.org/jdk/pull/19912


More information about the shenandoah-dev mailing list