174 assert(hr->get_next_young_region() == NULL, "cause it should!"); |
174 assert(hr->get_next_young_region() == NULL, "cause it should!"); |
175 |
175 |
176 hr->set_next_young_region(_head); |
176 hr->set_next_young_region(_head); |
177 _head = hr; |
177 _head = hr; |
178 |
178 |
179 hr->set_young(); |
179 _g1h->g1_policy()->set_region_eden(hr, (int) _length); |
180 double yg_surv_rate = _g1h->g1_policy()->predict_yg_surv_rate((int)_length); |
|
181 ++_length; |
180 ++_length; |
182 } |
181 } |
183 |
182 |
184 void YoungList::add_survivor_region(HeapRegion* hr) { |
183 void YoungList::add_survivor_region(HeapRegion* hr) { |
185 assert(hr->is_survivor(), "should be flagged as survivor region"); |
184 assert(hr->is_survivor(), "should be flagged as survivor region"); |
313 |
311 |
314 // Add survivor regions to SurvRateGroup. |
312 // Add survivor regions to SurvRateGroup. |
315 _g1h->g1_policy()->note_start_adding_survivor_regions(); |
313 _g1h->g1_policy()->note_start_adding_survivor_regions(); |
316 _g1h->g1_policy()->finished_recalculating_age_indexes(true /* is_survivors */); |
314 _g1h->g1_policy()->finished_recalculating_age_indexes(true /* is_survivors */); |
317 |
315 |
|
316 int young_index_in_cset = 0; |
318 for (HeapRegion* curr = _survivor_head; |
317 for (HeapRegion* curr = _survivor_head; |
319 curr != NULL; |
318 curr != NULL; |
320 curr = curr->get_next_young_region()) { |
319 curr = curr->get_next_young_region()) { |
321 _g1h->g1_policy()->set_region_survivors(curr); |
320 _g1h->g1_policy()->set_region_survivor(curr, young_index_in_cset); |
322 |
321 |
323 // The region is a non-empty survivor so let's add it to |
322 // The region is a non-empty survivor so let's add it to |
324 // the incremental collection set for the next evacuation |
323 // the incremental collection set for the next evacuation |
325 // pause. |
324 // pause. |
326 _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr); |
325 _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr); |
327 } |
326 young_index_in_cset += 1; |
|
327 } |
|
328 assert((size_t) young_index_in_cset == _survivor_length, |
|
329 "post-condition"); |
328 _g1h->g1_policy()->note_stop_adding_survivor_regions(); |
330 _g1h->g1_policy()->note_stop_adding_survivor_regions(); |
329 |
331 |
330 _head = _survivor_head; |
332 _head = _survivor_head; |
331 _length = _survivor_length; |
333 _length = _survivor_length; |
332 if (_survivor_head != NULL) { |
334 if (_survivor_head != NULL) { |
3249 } |
3249 } |
3250 |
3250 |
3251 void |
3251 void |
3252 G1CollectedHeap::setup_surviving_young_words() { |
3252 G1CollectedHeap::setup_surviving_young_words() { |
3253 guarantee( _surviving_young_words == NULL, "pre-condition" ); |
3253 guarantee( _surviving_young_words == NULL, "pre-condition" ); |
3254 size_t array_length = g1_policy()->young_cset_length(); |
3254 size_t array_length = g1_policy()->young_cset_region_length(); |
3255 _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, array_length); |
3255 _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, array_length); |
3256 if (_surviving_young_words == NULL) { |
3256 if (_surviving_young_words == NULL) { |
3257 vm_exit_out_of_memory(sizeof(size_t) * array_length, |
3257 vm_exit_out_of_memory(sizeof(size_t) * array_length, |
3258 "Not enough space for young surv words summary."); |
3258 "Not enough space for young surv words summary."); |
3259 } |
3259 } |
3266 } |
3266 } |
3267 |
3267 |
3268 void |
3268 void |
3269 G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) { |
3269 G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) { |
3270 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); |
3270 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); |
3271 size_t array_length = g1_policy()->young_cset_length(); |
3271 size_t array_length = g1_policy()->young_cset_region_length(); |
3272 for (size_t i = 0; i < array_length; ++i) |
3272 for (size_t i = 0; i < array_length; ++i) |
3273 _surviving_young_words[i] += surv_young_words[i]; |
3273 _surviving_young_words[i] += surv_young_words[i]; |
3274 } |
3274 } |
3275 |
3275 |
3276 void |
3276 void |
3277 G1CollectedHeap::cleanup_surviving_young_words() { |
3277 G1CollectedHeap::cleanup_surviving_young_words() { |
3278 guarantee( _surviving_young_words != NULL, "pre-condition" ); |
3278 guarantee( _surviving_young_words != NULL, "pre-condition" ); |
3279 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words); |
3279 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words); |
3280 _surviving_young_words = NULL; |
3280 _surviving_young_words = NULL; |
3281 } |
3281 } |
3282 |
|
3283 // </NEW PREDICTION> |
|
3284 |
3282 |
3285 #ifdef ASSERT |
3283 #ifdef ASSERT |
3286 class VerifyCSetClosure: public HeapRegionClosure { |
3284 class VerifyCSetClosure: public HeapRegionClosure { |
3287 public: |
3285 public: |
3288 bool doHeapRegion(HeapRegion* hr) { |
3286 bool doHeapRegion(HeapRegion* hr) { |
4156 // we allocate G1YoungSurvRateNumRegions plus one entries, since |
4154 // we allocate G1YoungSurvRateNumRegions plus one entries, since |
4157 // we "sacrifice" entry 0 to keep track of surviving bytes for |
4155 // we "sacrifice" entry 0 to keep track of surviving bytes for |
4158 // non-young regions (where the age is -1) |
4156 // non-young regions (where the age is -1) |
4159 // We also add a few elements at the beginning and at the end in |
4157 // We also add a few elements at the beginning and at the end in |
4160 // an attempt to eliminate cache contention |
4158 // an attempt to eliminate cache contention |
4161 size_t real_length = 1 + _g1h->g1_policy()->young_cset_length(); |
4159 size_t real_length = 1 + _g1h->g1_policy()->young_cset_region_length(); |
4162 size_t array_length = PADDING_ELEM_NUM + |
4160 size_t array_length = PADDING_ELEM_NUM + |
4163 real_length + |
4161 real_length + |
4164 PADDING_ELEM_NUM; |
4162 PADDING_ELEM_NUM; |
4165 _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length); |
4163 _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length); |
4166 if (_surviving_young_words_base == NULL) |
4164 if (_surviving_young_words_base == NULL) |
5593 cur->set_next_in_collection_set(NULL); |
5591 cur->set_next_in_collection_set(NULL); |
5594 cur->set_in_collection_set(false); |
5592 cur->set_in_collection_set(false); |
5595 |
5593 |
5596 if (cur->is_young()) { |
5594 if (cur->is_young()) { |
5597 int index = cur->young_index_in_cset(); |
5595 int index = cur->young_index_in_cset(); |
5598 guarantee( index != -1, "invariant" ); |
5596 assert(index != -1, "invariant"); |
5599 guarantee( (size_t)index < policy->young_cset_length(), "invariant" ); |
5597 assert((size_t) index < policy->young_cset_region_length(), "invariant"); |
5600 size_t words_survived = _surviving_young_words[index]; |
5598 size_t words_survived = _surviving_young_words[index]; |
5601 cur->record_surv_words_in_group(words_survived); |
5599 cur->record_surv_words_in_group(words_survived); |
5602 |
5600 |
5603 // At this point the we have 'popped' cur from the collection set |
5601 // At this point the we have 'popped' cur from the collection set |
5604 // (linked via next_in_collection_set()) but it is still in the |
5602 // (linked via next_in_collection_set()) but it is still in the |
5605 // young list (linked via next_young_region()). Clear the |
5603 // young list (linked via next_young_region()). Clear the |
5606 // _next_young_region field. |
5604 // _next_young_region field. |
5607 cur->set_next_young_region(NULL); |
5605 cur->set_next_young_region(NULL); |
5608 } else { |
5606 } else { |
5609 int index = cur->young_index_in_cset(); |
5607 int index = cur->young_index_in_cset(); |
5610 guarantee( index == -1, "invariant" ); |
5608 assert(index == -1, "invariant"); |
5611 } |
5609 } |
5612 |
5610 |
5613 assert( (cur->is_young() && cur->young_index_in_cset() > -1) || |
5611 assert( (cur->is_young() && cur->young_index_in_cset() > -1) || |
5614 (!cur->is_young() && cur->young_index_in_cset() == -1), |
5612 (!cur->is_young() && cur->young_index_in_cset() == -1), |
5615 "invariant" ); |
5613 "invariant" ); |
5618 // And the region is empty. |
5616 // And the region is empty. |
5619 assert(!cur->is_empty(), "Should not have empty regions in a CS."); |
5617 assert(!cur->is_empty(), "Should not have empty regions in a CS."); |
5620 free_region(cur, &pre_used, &local_free_list, false /* par */); |
5618 free_region(cur, &pre_used, &local_free_list, false /* par */); |
5621 } else { |
5619 } else { |
5622 cur->uninstall_surv_rate_group(); |
5620 cur->uninstall_surv_rate_group(); |
5623 if (cur->is_young()) |
5621 if (cur->is_young()) { |
5624 cur->set_young_index_in_cset(-1); |
5622 cur->set_young_index_in_cset(-1); |
|
5623 } |
5625 cur->set_not_young(); |
5624 cur->set_not_young(); |
5626 cur->set_evacuation_failed(false); |
5625 cur->set_evacuation_failed(false); |
5627 // The region is now considered to be old. |
5626 // The region is now considered to be old. |
5628 _old_set.add(cur); |
5627 _old_set.add(cur); |
5629 } |
5628 } |
5720 |
5719 |
5721 void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) { |
5720 void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) { |
5722 assert(heap_lock_held_for_gc(), |
5721 assert(heap_lock_held_for_gc(), |
5723 "the heap lock should already be held by or for this thread"); |
5722 "the heap lock should already be held by or for this thread"); |
5724 _young_list->push_region(hr); |
5723 _young_list->push_region(hr); |
5725 g1_policy()->set_region_short_lived(hr); |
|
5726 } |
5724 } |
5727 |
5725 |
5728 class NoYoungRegionsClosure: public HeapRegionClosure { |
5726 class NoYoungRegionsClosure: public HeapRegionClosure { |
5729 private: |
5727 private: |
5730 bool _success; |
5728 bool _success; |
5878 bool young_list_full = g1_policy()->is_young_list_full(); |
5876 bool young_list_full = g1_policy()->is_young_list_full(); |
5879 if (force || !young_list_full) { |
5877 if (force || !young_list_full) { |
5880 HeapRegion* new_alloc_region = new_region(word_size, |
5878 HeapRegion* new_alloc_region = new_region(word_size, |
5881 false /* do_expand */); |
5879 false /* do_expand */); |
5882 if (new_alloc_region != NULL) { |
5880 if (new_alloc_region != NULL) { |
5883 g1_policy()->update_region_num(true /* next_is_young */); |
|
5884 set_region_short_lived_locked(new_alloc_region); |
5881 set_region_short_lived_locked(new_alloc_region); |
5885 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full); |
5882 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full); |
5886 return new_alloc_region; |
5883 return new_alloc_region; |
5887 } |
5884 } |
5888 } |
5885 } |