RFR: 8357445: G1: Time-Based Heap Uncommit During Idle Periods [v12]

Monica Beckwith mbeckwit at openjdk.org
Sun Dec 21 18:51:35 UTC 2025


> **Implements:** https://bugs.openjdk.org/browse/JDK-8357445
> 
> Implement time-based heap uncommit for G1 during idle periods.
> 
> Key changes:
> - Added G1HeapEvaluationTask for periodic heap evaluation
> - Switch from G1ServiceTask to PeriodicTask for improved scheduling
> - Implemented time-based heap sizing policy with configurable uncommit delay
> - Added region activity tracking with last access timestamps
> - Integrated VM_G1ShrinkHeap operation for safe heap shrinking
> - Added new G1 flags: G1UseTimeBasedHeapSizing, G1TimeBasedEvaluationIntervalMillis, G1UncommitDelayMillis, G1MinRegionsToUncommit
> - Added 'sizing' log tag for heap sizing operations
> 
> Comprehensive Test Coverage:
> - Enhanced TestG1RegionUncommit: minimum heap boundaries, concurrent allocation/uncommit scenarios
> - Enhanced TestTimeBasedHeapSizing: humongous object handling, rapid allocation cycles, edge cases
> - Enhanced TestTimeBasedRegionTracking: concurrent region access, lifecycle transition validation
> - Enhanced TestTimeBasedHeapConfig: parameter boundary values, small heap configurations
> 
> This ensures time-based heap uncommit works correctly while maintaining all safety guarantees and test expectations.

Monica Beckwith has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR. The pull request contains one new commit since the last revision:

  Address Thomas Schatzl's review comments for JDK-8357445
  
  This commit addresses all issues raised in Thomas's November 2025 review
  of the time-based heap uncommit feature (PR #26240).
  
  Major architectural fix:
  - VM_G1ShrinkHeap::doit() now re-evaluates uncommit candidates at safepoint
    time by calling find_uncommit_candidates_by_time() during VM operation
    execution. This ensures regions are validated as still free at the point
    of uncommit, fixing the race condition where heap state could change
    between service thread evaluation and VM operation execution.
  
  Code quality improvements:
  - Removed redundant is_empty() checks in g1HeapSizingPolicy.cpp and
    g1HeapRegionManager.cpp since is_free() already implies empty
  - Replaced inefficient bubble sort with GrowableArray::sort() using
    lambda comparator for O(n log n) performance
  - Fixed lambda signature (G1HeapRegion** instead of const*) to match
    GrowableArray::sort() requirements
  - Added periods to sentence-style comments for consistency
  
  The implementation already had correct:
  - SuspendibleThreadSetJoiner placement in service thread task
  - GC coordination with 5% overhead threshold and G1ReservePercent
  - Proper assertions and validations
  
  Tested with SPECjbb2015 showing correct time-based region selection
  and uncommit behavior across varying load patterns.

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/26240/files
  - new: https://git.openjdk.org/jdk/pull/26240/files/cc7a779a..877ce1d2

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=26240&range=11
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=26240&range=10-11

  Stats: 10 lines in 3 files changed: 0 ins; 0 del; 10 mod
  Patch: https://git.openjdk.org/jdk/pull/26240.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/26240/head:pull/26240

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


More information about the hotspot-dev mailing list