src/share/vm/gc_implementation/g1/g1ParScanThreadState.cpp

Print this page

        

*** 158,172 **** int young_index = from_region->young_index_in_cset()+1; assert( (from_region->is_young() && young_index > 0) || (!from_region->is_young() && young_index == 0), "invariant" ); G1CollectorPolicy* g1p = _g1h->g1_policy(); markOop m = old->mark(); ! int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age() : m->age(); GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age, word_sz); ! HeapWord* obj_ptr = allocate(alloc_purpose, word_sz); #ifndef PRODUCT // Should this evacuation fail? if (_g1h->evacuation_should_fail()) { if (obj_ptr != NULL) { undo_allocation(alloc_purpose, obj_ptr, word_sz); --- 158,172 ---- int young_index = from_region->young_index_in_cset()+1; assert( (from_region->is_young() && young_index > 0) || (!from_region->is_young() && young_index == 0), "invariant" ); G1CollectorPolicy* g1p = _g1h->g1_policy(); markOop m = old->mark(); ! uint age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age() : m->age(); GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age, word_sz); ! HeapWord* obj_ptr = allocate(alloc_purpose, old, age); #ifndef PRODUCT // Should this evacuation fail? if (_g1h->evacuation_should_fail()) { if (obj_ptr != NULL) { undo_allocation(alloc_purpose, obj_ptr, word_sz);
*** 250,279 **** obj = forward_ptr; } return obj; } ! HeapWord* G1ParScanThreadState::allocate_slow(GCAllocPurpose purpose, size_t word_sz) { HeapWord* obj = NULL; size_t gclab_word_size = _g1h->desired_plab_sz(purpose); if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) { G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose); add_to_alloc_buffer_waste(alloc_buf->words_remaining()); alloc_buf->retire(false /* end_of_gc */, false /* retain */); ! HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size); if (buf == NULL) { return NULL; // Let caller handle allocation failure. } // Otherwise. alloc_buf->set_word_size(gclab_word_size); alloc_buf->set_buf(buf); obj = alloc_buf->allocate(word_sz); assert(obj != NULL, "buffer was definitely big enough..."); } else { ! obj = _g1h->par_allocate_during_gc(purpose, word_sz); } return obj; } void G1ParScanThreadState::undo_allocation(GCAllocPurpose purpose, HeapWord* obj, size_t word_sz) { --- 250,281 ---- obj = forward_ptr; } return obj; } ! HeapWord* G1ParScanThreadState::allocate_slow(GCAllocPurpose purpose, ! oop const old, uint age) { HeapWord* obj = NULL; + size_t word_sz = old->size(); size_t gclab_word_size = _g1h->desired_plab_sz(purpose); if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) { G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose); add_to_alloc_buffer_waste(alloc_buf->words_remaining()); alloc_buf->retire(false /* end_of_gc */, false /* retain */); ! HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size, old, age); if (buf == NULL) { return NULL; // Let caller handle allocation failure. } // Otherwise. alloc_buf->set_word_size(gclab_word_size); alloc_buf->set_buf(buf); obj = alloc_buf->allocate(word_sz); assert(obj != NULL, "buffer was definitely big enough..."); } else { ! obj = _g1h->par_allocate_during_gc(purpose, word_sz, old, age); } return obj; } void G1ParScanThreadState::undo_allocation(GCAllocPurpose purpose, HeapWord* obj, size_t word_sz) {
*** 285,305 **** CollectedHeap::fill_with_object(obj, word_sz); add_to_undo_waste(word_sz); } } ! HeapWord* G1ParScanThreadState::allocate(GCAllocPurpose purpose, size_t word_sz) { HeapWord* obj = NULL; if (purpose == GCAllocForSurvived) { obj = alloc_buffer(GCAllocForSurvived)->allocate_aligned(word_sz, SurvivorAlignmentInBytes); } else { obj = alloc_buffer(GCAllocForTenured)->allocate(word_sz); } if (obj != NULL) { return obj; } ! return allocate_slow(purpose, word_sz); } void G1ParScanThreadState::retire_alloc_buffers() { for (int ap = 0; ap < GCAllocPurposeCount; ++ap) { size_t waste = _alloc_buffers[ap]->words_remaining(); --- 287,308 ---- CollectedHeap::fill_with_object(obj, word_sz); add_to_undo_waste(word_sz); } } ! HeapWord* G1ParScanThreadState::allocate(GCAllocPurpose purpose, oop const old, uint age) { HeapWord* obj = NULL; + size_t word_sz = old->size(); if (purpose == GCAllocForSurvived) { obj = alloc_buffer(GCAllocForSurvived)->allocate_aligned(word_sz, SurvivorAlignmentInBytes); } else { obj = alloc_buffer(GCAllocForTenured)->allocate(word_sz); } if (obj != NULL) { return obj; } ! return allocate_slow(purpose, old, age); } void G1ParScanThreadState::retire_alloc_buffers() { for (int ap = 0; ap < GCAllocPurposeCount; ++ap) { size_t waste = _alloc_buffers[ap]->words_remaining();