提交 fc4ce03f 编写于 作者: T tonyp

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
上级 d9b86780
...@@ -2194,9 +2194,12 @@ size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const { ...@@ -2194,9 +2194,12 @@ size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
} }
} }
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; 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() { bool G1CollectedHeap::allocs_are_zero_filled() {
...@@ -3639,6 +3642,10 @@ void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) { ...@@ -3639,6 +3642,10 @@ void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) {
HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose, HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
size_t word_size) { 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]; HeapRegion* alloc_region = _gc_alloc_regions[purpose];
// let the caller handle alloc failure // let the caller handle alloc failure
if (alloc_region == NULL) return NULL; if (alloc_region == NULL) return NULL;
...@@ -3671,6 +3678,10 @@ G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose, ...@@ -3671,6 +3678,10 @@ G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose,
HeapRegion* alloc_region, HeapRegion* alloc_region,
bool par, bool par,
size_t word_size) { 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; HeapWord* block = NULL;
// In the parallel case, a previous thread to obtain the lock may have // In the parallel case, a previous thread to obtain the lock may have
// already assigned a new gc_alloc_region. // already assigned a new gc_alloc_region.
......
...@@ -1032,7 +1032,7 @@ public: ...@@ -1032,7 +1032,7 @@ public:
virtual bool supports_tlab_allocation() const; virtual bool supports_tlab_allocation() const;
virtual size_t tlab_capacity(Thread* thr) const; virtual size_t tlab_capacity(Thread* thr) const;
virtual size_t unsafe_max_tlab_alloc(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? // Can a compiler initialize a new object without store barriers?
// This permission only extends from the creation of a new object // This permission only extends from the creation of a new object
......
...@@ -57,8 +57,9 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t word_size, ...@@ -57,8 +57,9 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t word_size,
assert( SafepointSynchronize::is_at_safepoint() || assert( SafepointSynchronize::is_at_safepoint() ||
Heap_lock->owned_by_self(), "pre-condition of the call" ); 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, // If this allocation causes a region to become non empty,
// then we need to update our free_regions count. // then we need to update our free_regions count.
...@@ -69,13 +70,14 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t word_size, ...@@ -69,13 +70,14 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t word_size,
} else { } else {
res = _cur_alloc_region->allocate(word_size); res = _cur_alloc_region->allocate(word_size);
} }
}
if (res != NULL) { if (res != NULL) {
if (!SafepointSynchronize::is_at_safepoint()) { if (!SafepointSynchronize::is_at_safepoint()) {
assert( Heap_lock->owned_by_self(), "invariant" ); assert( Heap_lock->owned_by_self(), "invariant" );
Heap_lock->unlock(); Heap_lock->unlock();
}
return res;
} }
return res;
} }
// attempt_allocation_slow will also unlock the heap lock when appropriate. // attempt_allocation_slow will also unlock the heap lock when appropriate.
return attempt_allocation_slow(word_size, permit_collection_pause); return attempt_allocation_slow(word_size, permit_collection_pause);
......
...@@ -790,8 +790,18 @@ void HeapRegion::verify(bool allow_dirty, ...@@ -790,8 +790,18 @@ void HeapRegion::verify(bool allow_dirty,
int objs = 0; int objs = 0;
int blocks = 0; int blocks = 0;
VerifyLiveClosure vl_cl(g1, use_prev_marking); VerifyLiveClosure vl_cl(g1, use_prev_marking);
bool is_humongous = isHumongous();
size_t object_num = 0;
while (p < top()) { while (p < top()) {
size_t size = oop(p)->size(); 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) { if (blocks == BLOCK_SAMPLE_INTERVAL) {
HeapWord* res = block_start_const(p + (size/2)); HeapWord* res = block_start_const(p + (size/2));
if (p != res) { if (p != res) {
...@@ -857,6 +867,13 @@ void HeapRegion::verify(bool allow_dirty, ...@@ -857,6 +867,13 @@ void HeapRegion::verify(bool allow_dirty,
} }
} }
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()) { if (p != top()) {
gclog_or_tty->print_cr("end of last object "PTR_FORMAT" " gclog_or_tty->print_cr("end of last object "PTR_FORMAT" "
"does not match top "PTR_FORMAT, p, top()); "does not match top "PTR_FORMAT, p, top());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册