102 _g1h->alloc_buffer_stats(InCSetState::Young)->adjust_desired_plab_sz(no_of_gc_workers); 103 _g1h->alloc_buffer_stats(InCSetState::Old)->adjust_desired_plab_sz(no_of_gc_workers); 104 } 105 } 106 107 void G1DefaultAllocator::abandon_gc_alloc_regions() { 108 assert(survivor_gc_alloc_region(AllocationContext::current())->get() == NULL, "pre-condition"); 109 assert(old_gc_alloc_region(AllocationContext::current())->get() == NULL, "pre-condition"); 110 _retained_old_gc_alloc_region = NULL; 111 } 112 113 G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) : 114 ParGCAllocBuffer(gclab_word_size), _retired(true) { } 115 116 HeapWord* G1ParGCAllocator::allocate_direct_or_new_plab(InCSetState dest, 117 size_t word_sz, 118 AllocationContext_t context) { 119 size_t gclab_word_size = _g1h->desired_plab_sz(dest); 120 if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) { 121 G1ParGCAllocBuffer* alloc_buf = alloc_buffer(dest, context); 122 add_to_alloc_buffer_waste(alloc_buf->words_remaining()); 123 alloc_buf->retire(); 124 125 HeapWord* buf = _g1h->par_allocate_during_gc(dest, gclab_word_size, context); 126 if (buf == NULL) { 127 return NULL; // Let caller handle allocation failure. 128 } 129 // Otherwise. 130 alloc_buf->set_word_size(gclab_word_size); 131 alloc_buf->set_buf(buf); 132 133 HeapWord* const obj = alloc_buf->allocate(word_sz); 134 assert(obj != NULL, "buffer was definitely big enough..."); 135 return obj; 136 } else { 137 return _g1h->par_allocate_during_gc(dest, word_sz, context); 138 } 139 } 140 141 G1DefaultParGCAllocator::G1DefaultParGCAllocator(G1CollectedHeap* g1h) : 142 G1ParGCAllocator(g1h), 143 _surviving_alloc_buffer(g1h->desired_plab_sz(InCSetState::Young)), 144 _tenured_alloc_buffer(g1h->desired_plab_sz(InCSetState::Old)) { 145 for (uint state = 0; state < InCSetState::Num; state++) { 146 _alloc_buffers[state] = NULL; 147 } 148 _alloc_buffers[InCSetState::Young] = &_surviving_alloc_buffer; 149 _alloc_buffers[InCSetState::Old] = &_tenured_alloc_buffer; 150 } 151 152 void G1DefaultParGCAllocator::retire_alloc_buffers() { 153 for (uint state = 0; state < InCSetState::Num; state++) { 154 G1ParGCAllocBuffer* const buf = _alloc_buffers[state]; 155 if (buf != NULL) { 156 add_to_alloc_buffer_waste(buf->words_remaining()); 157 buf->flush_and_retire_stats(_g1h->alloc_buffer_stats(state)); 158 } 159 } 160 } | 102 _g1h->alloc_buffer_stats(InCSetState::Young)->adjust_desired_plab_sz(no_of_gc_workers); 103 _g1h->alloc_buffer_stats(InCSetState::Old)->adjust_desired_plab_sz(no_of_gc_workers); 104 } 105 } 106 107 void G1DefaultAllocator::abandon_gc_alloc_regions() { 108 assert(survivor_gc_alloc_region(AllocationContext::current())->get() == NULL, "pre-condition"); 109 assert(old_gc_alloc_region(AllocationContext::current())->get() == NULL, "pre-condition"); 110 _retained_old_gc_alloc_region = NULL; 111 } 112 113 G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) : 114 ParGCAllocBuffer(gclab_word_size), _retired(true) { } 115 116 HeapWord* G1ParGCAllocator::allocate_direct_or_new_plab(InCSetState dest, 117 size_t word_sz, 118 AllocationContext_t context) { 119 size_t gclab_word_size = _g1h->desired_plab_sz(dest); 120 if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) { 121 G1ParGCAllocBuffer* alloc_buf = alloc_buffer(dest, context); 122 alloc_buf->retire(); 123 124 HeapWord* buf = _g1h->par_allocate_during_gc(dest, gclab_word_size, context); 125 if (buf == NULL) { 126 return NULL; // Let caller handle allocation failure. 127 } 128 // Otherwise. 129 alloc_buf->set_word_size(gclab_word_size); 130 alloc_buf->set_buf(buf); 131 132 HeapWord* const obj = alloc_buf->allocate(word_sz); 133 assert(obj != NULL, "buffer was definitely big enough..."); 134 return obj; 135 } else { 136 return _g1h->par_allocate_during_gc(dest, word_sz, context); 137 } 138 } 139 140 G1DefaultParGCAllocator::G1DefaultParGCAllocator(G1CollectedHeap* g1h) : 141 G1ParGCAllocator(g1h), 142 _surviving_alloc_buffer(g1h->desired_plab_sz(InCSetState::Young)), 143 _tenured_alloc_buffer(g1h->desired_plab_sz(InCSetState::Old)) { 144 for (uint state = 0; state < InCSetState::Num; state++) { 145 _alloc_buffers[state] = NULL; 146 } 147 _alloc_buffers[InCSetState::Young] = &_surviving_alloc_buffer; 148 _alloc_buffers[InCSetState::Old] = &_tenured_alloc_buffer; 149 } 150 151 void G1DefaultParGCAllocator::retire_alloc_buffers() { 152 for (uint state = 0; state < InCSetState::Num; state++) { 153 G1ParGCAllocBuffer* const buf = _alloc_buffers[state]; 154 if (buf != NULL) { 155 buf->flush_and_retire_stats(_g1h->alloc_buffer_stats(state)); 156 } 157 } 158 } 159 160 G1PLABWasteStat G1DefaultParGCAllocator::wasted() { 161 G1PLABWasteStat total_wasted; 162 for (uint state = 0; state < InCSetState::Num; state++) { 163 G1ParGCAllocBuffer * const buf = _alloc_buffers[state]; 164 if (buf != NULL) { 165 total_wasted.add_wasted(buf->wasted()); 166 total_wasted.add_undo_wasted(buf->undo_wasted()); 167 } 168 } 169 return total_wasted; 170 } |