Skip to content

Commit f2afe0a

Browse files
author
Thomas Schatzl
committed
8268556: Use bitmap for storing regions that failed evacuation
Reviewed-by: kbarrett, iwalulya, sjohanss
1 parent 2d088fa commit f2afe0a

File tree

3 files changed

+8
-11
lines changed

3 files changed

+8
-11
lines changed

src/hotspot/share/gc/g1/g1CollectedHeap.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1477,7 +1477,7 @@ G1CollectedHeap::G1CollectedHeap() :
14771477
_cr(NULL),
14781478
_task_queues(NULL),
14791479
_num_regions_failed_evacuation(0),
1480-
_regions_failed_evacuation(NULL),
1480+
_regions_failed_evacuation(mtGC),
14811481
_evacuation_failed_info_array(NULL),
14821482
_preserved_marks_set(true /* in_c_heap */),
14831483
#ifndef PRODUCT
@@ -1770,7 +1770,7 @@ jint G1CollectedHeap::initialize() {
17701770

17711771
_collection_set.initialize(max_reserved_regions());
17721772

1773-
_regions_failed_evacuation = NEW_C_HEAP_ARRAY(volatile bool, max_regions(), mtGC);
1773+
_regions_failed_evacuation.resize(max_regions());
17741774

17751775
G1InitLogger::print();
17761776

@@ -3470,7 +3470,7 @@ void G1CollectedHeap::pre_evacuate_collection_set(G1EvacuationInfo& evacuation_i
34703470
_expand_heap_after_alloc_failure = true;
34713471
Atomic::store(&_num_regions_failed_evacuation, 0u);
34723472

3473-
memset((void*)_regions_failed_evacuation, false, sizeof(bool) * max_regions());
3473+
_regions_failed_evacuation.clear();
34743474

34753475
// Disable the hot card cache.
34763476
_hot_card_cache->reset_hot_cache_claimed_index();

src/hotspot/share/gc/g1/g1CollectedHeap.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#include "gc/shared/softRefPolicy.hpp"
5656
#include "gc/shared/taskqueue.hpp"
5757
#include "memory/memRegion.hpp"
58+
#include "utilities/bitMap.hpp"
5859
#include "utilities/stack.hpp"
5960

6061
// A "G1CollectedHeap" is an implementation of a java heap for HotSpot.
@@ -868,7 +869,7 @@ class G1CollectedHeap : public CollectedHeap {
868869
// Number of regions evacuation failed in the current collection.
869870
volatile uint _num_regions_failed_evacuation;
870871
// Records for every region on the heap whether evacuation failed for it.
871-
volatile bool* _regions_failed_evacuation;
872+
CHeapBitMap _regions_failed_evacuation;
872873

873874
EvacuationFailedInfo* _evacuation_failed_info_array;
874875

src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp

+3-7
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "gc/shared/markBitMap.inline.hpp"
3838
#include "gc/shared/taskqueue.inline.hpp"
3939
#include "runtime/atomic.hpp"
40+
#include "utilities/bitMap.inline.hpp"
4041

4142
G1GCPhaseTimes* G1CollectedHeap::phase_times() const {
4243
return _policy->phase_times();
@@ -195,20 +196,15 @@ bool G1CollectedHeap::evacuation_failed() const {
195196
}
196197

197198
bool G1CollectedHeap::evacuation_failed(uint region_idx) const {
198-
assert(region_idx < max_regions(), "Invalid region index %u", region_idx);
199-
200-
return Atomic::load(&_regions_failed_evacuation[region_idx]);
199+
return _regions_failed_evacuation.par_at(region_idx, memory_order_relaxed);
201200
}
202201

203202
uint G1CollectedHeap::num_regions_failed_evacuation() const {
204203
return Atomic::load(&_num_regions_failed_evacuation);
205204
}
206205

207206
bool G1CollectedHeap::notify_region_failed_evacuation(uint const region_idx) {
208-
assert(region_idx < max_regions(), "Invalid region index %u", region_idx);
209-
210-
volatile bool* region_failed_addr = &_regions_failed_evacuation[region_idx];
211-
bool result = !Atomic::load(region_failed_addr) && !Atomic::cmpxchg(region_failed_addr, false, true, memory_order_relaxed);
207+
bool result = _regions_failed_evacuation.par_set_bit(region_idx, memory_order_relaxed);
212208
if (result) {
213209
Atomic::inc(&_num_regions_failed_evacuation, memory_order_relaxed);
214210
}

0 commit comments

Comments
 (0)