8148759: G1AllocRegion::_count inconsistently used if more than one context is active
Reviewed-by: sjohanss, jwilhelm, tschatzl
--- a/hotspot/src/share/vm/gc/g1/g1AllocRegion.cpp Fri Mar 18 21:01:28 2016 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1AllocRegion.cpp Fri Mar 18 10:51:29 2016 +0100
@@ -253,7 +253,7 @@
HeapRegion* G1GCAllocRegion::allocate_new_region(size_t word_size,
bool force) {
assert(!force, "not supported for GC alloc regions");
- return _g1h->new_gc_alloc_region(word_size, count(), _purpose);
+ return _g1h->new_gc_alloc_region(word_size, _purpose);
}
void G1GCAllocRegion::retire_region(HeapRegion* alloc_region,
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Mar 18 21:01:28 2016 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Mar 18 10:51:29 2016 +0100
@@ -5361,33 +5361,43 @@
// Methods for the GC alloc regions
-HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size,
- uint count,
- InCSetState dest) {
+bool G1CollectedHeap::has_more_regions(InCSetState dest) {
+ if (dest.is_old()) {
+ return true;
+ } else {
+ return young_list()->survivor_length() < g1_policy()->max_survivor_regions();
+ }
+}
+
+HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size, InCSetState dest) {
assert(FreeList_lock->owned_by_self(), "pre-condition");
- if (count < g1_policy()->max_regions(dest)) {
- const bool is_survivor = (dest.is_young());
- HeapRegion* new_alloc_region = new_region(word_size,
- !is_survivor,
- true /* do_expand */);
- if (new_alloc_region != NULL) {
- // We really only need to do this for old regions given that we
- // should never scan survivors. But it doesn't hurt to do it
- // for survivors too.
- new_alloc_region->record_timestamp();
- if (is_survivor) {
- new_alloc_region->set_survivor();
- _verifier->check_bitmaps("Survivor Region Allocation", new_alloc_region);
- } else {
- new_alloc_region->set_old();
- _verifier->check_bitmaps("Old Region Allocation", new_alloc_region);
- }
- _hr_printer.alloc(new_alloc_region);
- bool during_im = collector_state()->during_initial_mark_pause();
- new_alloc_region->note_start_of_copying(during_im);
- return new_alloc_region;
+ if (!has_more_regions(dest)) {
+ return NULL;
+ }
+
+ const bool is_survivor = dest.is_young();
+
+ HeapRegion* new_alloc_region = new_region(word_size,
+ !is_survivor,
+ true /* do_expand */);
+ if (new_alloc_region != NULL) {
+ // We really only need to do this for old regions given that we
+ // should never scan survivors. But it doesn't hurt to do it
+ // for survivors too.
+ new_alloc_region->record_timestamp();
+ if (is_survivor) {
+ new_alloc_region->set_survivor();
+ young_list()->add_survivor_region(new_alloc_region);
+ _verifier->check_bitmaps("Survivor Region Allocation", new_alloc_region);
+ } else {
+ new_alloc_region->set_old();
+ _verifier->check_bitmaps("Old Region Allocation", new_alloc_region);
}
+ _hr_printer.alloc(new_alloc_region);
+ bool during_im = collector_state()->during_initial_mark_pause();
+ new_alloc_region->note_start_of_copying(during_im);
+ return new_alloc_region;
}
return NULL;
}
@@ -5398,9 +5408,7 @@
bool during_im = collector_state()->during_initial_mark_pause();
alloc_region->note_end_of_copying(during_im);
g1_policy()->record_bytes_copied_during_gc(allocated_bytes);
- if (dest.is_young()) {
- young_list()->add_survivor_region(alloc_region);
- } else {
+ if (dest.is_old()) {
_old_set.add(alloc_region);
}
_hr_printer.retire(alloc_region);
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Fri Mar 18 21:01:28 2016 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Fri Mar 18 10:51:29 2016 +0100
@@ -471,8 +471,8 @@
size_t allocated_bytes);
// For GC alloc regions.
- HeapRegion* new_gc_alloc_region(size_t word_size, uint count,
- InCSetState dest);
+ bool has_more_regions(InCSetState dest);
+ HeapRegion* new_gc_alloc_region(size_t word_size, InCSetState dest);
void retire_gc_alloc_region(HeapRegion* alloc_region,
size_t allocated_bytes, InCSetState dest);
--- a/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp Fri Mar 18 21:01:28 2016 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp Fri Mar 18 10:51:29 2016 +0100
@@ -424,22 +424,6 @@
return _max_survivor_regions;
}
- static const uint REGIONS_UNLIMITED = (uint) -1;
-
- uint max_regions(InCSetState dest) const {
- switch (dest.value()) {
- case InCSetState::Young:
- return _max_survivor_regions;
- case InCSetState::Old:
- return REGIONS_UNLIMITED;
- default:
- assert(false, "Unknown dest state: " CSETSTATE_FORMAT, dest.value());
- break;
- }
- // keep some compilers happy
- return 0;
- }
-
void note_start_adding_survivor_regions() {
_survivor_surv_rate_group->start_adding_regions();
}