8268556: Use bitmap for storing regions that failed evacuation

Reviewed-by: kbarrett, iwalulya, sjohanss
This commit is contained in:
Thomas Schatzl 2021-06-17 17:22:09 +00:00
parent 2d088fa91d
commit f2afe0a513
3 changed files with 8 additions and 11 deletions

@ -1477,7 +1477,7 @@ G1CollectedHeap::G1CollectedHeap() :
_cr(NULL),
_task_queues(NULL),
_num_regions_failed_evacuation(0),
_regions_failed_evacuation(NULL),
_regions_failed_evacuation(mtGC),
_evacuation_failed_info_array(NULL),
_preserved_marks_set(true /* in_c_heap */),
#ifndef PRODUCT
@ -1770,7 +1770,7 @@ jint G1CollectedHeap::initialize() {
_collection_set.initialize(max_reserved_regions());
_regions_failed_evacuation = NEW_C_HEAP_ARRAY(volatile bool, max_regions(), mtGC);
_regions_failed_evacuation.resize(max_regions());
G1InitLogger::print();
@ -3470,7 +3470,7 @@ void G1CollectedHeap::pre_evacuate_collection_set(G1EvacuationInfo& evacuation_i
_expand_heap_after_alloc_failure = true;
Atomic::store(&_num_regions_failed_evacuation, 0u);
memset((void*)_regions_failed_evacuation, false, sizeof(bool) * max_regions());
_regions_failed_evacuation.clear();
// Disable the hot card cache.
_hot_card_cache->reset_hot_cache_claimed_index();

@ -55,6 +55,7 @@
#include "gc/shared/softRefPolicy.hpp"
#include "gc/shared/taskqueue.hpp"
#include "memory/memRegion.hpp"
#include "utilities/bitMap.hpp"
#include "utilities/stack.hpp"
// A "G1CollectedHeap" is an implementation of a java heap for HotSpot.
@ -868,7 +869,7 @@ public:
// Number of regions evacuation failed in the current collection.
volatile uint _num_regions_failed_evacuation;
// Records for every region on the heap whether evacuation failed for it.
volatile bool* _regions_failed_evacuation;
CHeapBitMap _regions_failed_evacuation;
EvacuationFailedInfo* _evacuation_failed_info_array;

@ -37,6 +37,7 @@
#include "gc/shared/markBitMap.inline.hpp"
#include "gc/shared/taskqueue.inline.hpp"
#include "runtime/atomic.hpp"
#include "utilities/bitMap.inline.hpp"
G1GCPhaseTimes* G1CollectedHeap::phase_times() const {
return _policy->phase_times();
@ -195,9 +196,7 @@ bool G1CollectedHeap::evacuation_failed() const {
}
bool G1CollectedHeap::evacuation_failed(uint region_idx) const {
assert(region_idx < max_regions(), "Invalid region index %u", region_idx);
return Atomic::load(&_regions_failed_evacuation[region_idx]);
return _regions_failed_evacuation.par_at(region_idx, memory_order_relaxed);
}
uint G1CollectedHeap::num_regions_failed_evacuation() const {
@ -205,10 +204,7 @@ uint G1CollectedHeap::num_regions_failed_evacuation() const {
}
bool G1CollectedHeap::notify_region_failed_evacuation(uint const region_idx) {
assert(region_idx < max_regions(), "Invalid region index %u", region_idx);
volatile bool* region_failed_addr = &_regions_failed_evacuation[region_idx];
bool result = !Atomic::load(region_failed_addr) && !Atomic::cmpxchg(region_failed_addr, false, true, memory_order_relaxed);
bool result = _regions_failed_evacuation.par_set_bit(region_idx, memory_order_relaxed);
if (result) {
Atomic::inc(&_num_regions_failed_evacuation, memory_order_relaxed);
}