6974928: G1: sometimes humongous objects are allocated in young regions
Summary: as the title says, sometimes we are allocating humongous objects in young regions and we shouldn't.
Reviewed-by: ysr, johnc
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Aug 17 14:40:00 2010 -0400
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Aug 17 14:40:00 2010 -0400
@@ -2194,9 +2194,12 @@
}
}
-HeapWord* G1CollectedHeap::allocate_new_tlab(size_t size) {
+HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
+ assert(!isHumongous(word_size),
+ err_msg("a TLAB should not be of humongous size, "
+ "word_size = "SIZE_FORMAT, word_size));
bool dummy;
- return G1CollectedHeap::mem_allocate(size, false, true, &dummy);
+ return G1CollectedHeap::mem_allocate(word_size, false, true, &dummy);
}
bool G1CollectedHeap::allocs_are_zero_filled() {
@@ -3639,6 +3642,10 @@
HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
size_t word_size) {
+ assert(!isHumongous(word_size),
+ err_msg("we should not be seeing humongous allocation requests "
+ "during GC, word_size = "SIZE_FORMAT, word_size));
+
HeapRegion* alloc_region = _gc_alloc_regions[purpose];
// let the caller handle alloc failure
if (alloc_region == NULL) return NULL;
@@ -3671,6 +3678,10 @@
HeapRegion* alloc_region,
bool par,
size_t word_size) {
+ assert(!isHumongous(word_size),
+ err_msg("we should not be seeing humongous allocation requests "
+ "during GC, word_size = "SIZE_FORMAT, word_size));
+
HeapWord* block = NULL;
// In the parallel case, a previous thread to obtain the lock may have
// already assigned a new gc_alloc_region.
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Tue Aug 17 14:40:00 2010 -0400
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Tue Aug 17 14:40:00 2010 -0400
@@ -1032,7 +1032,7 @@
virtual bool supports_tlab_allocation() const;
virtual size_t tlab_capacity(Thread* thr) const;
virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
- virtual HeapWord* allocate_new_tlab(size_t size);
+ virtual HeapWord* allocate_new_tlab(size_t word_size);
// Can a compiler initialize a new object without store barriers?
// This permission only extends from the creation of a new object
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp Tue Aug 17 14:40:00 2010 -0400
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp Tue Aug 17 14:40:00 2010 -0400
@@ -57,8 +57,9 @@
assert( SafepointSynchronize::is_at_safepoint() ||
Heap_lock->owned_by_self(), "pre-condition of the call" );
- if (_cur_alloc_region != NULL) {
-
+ // All humongous allocation requests should go through the slow path in
+ // attempt_allocation_slow().
+ if (!isHumongous(word_size) && _cur_alloc_region != NULL) {
// If this allocation causes a region to become non empty,
// then we need to update our free_regions count.
@@ -69,13 +70,14 @@
} else {
res = _cur_alloc_region->allocate(word_size);
}
- }
- if (res != NULL) {
- if (!SafepointSynchronize::is_at_safepoint()) {
- assert( Heap_lock->owned_by_self(), "invariant" );
- Heap_lock->unlock();
+
+ if (res != NULL) {
+ if (!SafepointSynchronize::is_at_safepoint()) {
+ assert( Heap_lock->owned_by_self(), "invariant" );
+ Heap_lock->unlock();
+ }
+ return res;
}
- return res;
}
// attempt_allocation_slow will also unlock the heap lock when appropriate.
return attempt_allocation_slow(word_size, permit_collection_pause);
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Tue Aug 17 14:40:00 2010 -0400
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Tue Aug 17 14:40:00 2010 -0400
@@ -790,8 +790,18 @@
int objs = 0;
int blocks = 0;
VerifyLiveClosure vl_cl(g1, use_prev_marking);
+ bool is_humongous = isHumongous();
+ size_t object_num = 0;
while (p < top()) {
size_t size = oop(p)->size();
+ if (is_humongous != g1->isHumongous(size)) {
+ gclog_or_tty->print_cr("obj "PTR_FORMAT" is of %shumongous size ("
+ SIZE_FORMAT" words) in a %shumongous region",
+ p, g1->isHumongous(size) ? "" : "non-",
+ size, is_humongous ? "" : "non-");
+ *failures = true;
+ }
+ object_num += 1;
if (blocks == BLOCK_SAMPLE_INTERVAL) {
HeapWord* res = block_start_const(p + (size/2));
if (p != res) {
@@ -857,6 +867,13 @@
}
}
+ if (is_humongous && object_num > 1) {
+ gclog_or_tty->print_cr("region ["PTR_FORMAT","PTR_FORMAT"] is humongous "
+ "but has "SIZE_FORMAT", objects",
+ bottom(), end(), object_num);
+ *failures = true;
+ }
+
if (p != top()) {
gclog_or_tty->print_cr("end of last object "PTR_FORMAT" "
"does not match top "PTR_FORMAT, p, top());