hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
changeset 11169 0cfe4d79060c
parent 10997 0be4b3be7197
child 11174 fccee5238e70
equal deleted inserted replaced
11001:4ba0436b3b29 11169:0cfe4d79060c
   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");
   188   hr->set_next_young_region(_survivor_head);
   187   hr->set_next_young_region(_survivor_head);
   189   if (_survivor_head == NULL) {
   188   if (_survivor_head == NULL) {
   190     _survivor_tail = hr;
   189     _survivor_tail = hr;
   191   }
   190   }
   192   _survivor_head = hr;
   191   _survivor_head = hr;
   193 
       
   194   ++_survivor_length;
   192   ++_survivor_length;
   195 }
   193 }
   196 
   194 
   197 void YoungList::empty_list(HeapRegion* list) {
   195 void YoungList::empty_list(HeapRegion* list) {
   198   while (list != NULL) {
   196   while (list != NULL) {
   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) {
  3208     _cmThread->set_started();
  3210     _cmThread->set_started();
  3209     CGC_lock->notify();
  3211     CGC_lock->notify();
  3210   }
  3212   }
  3211 }
  3213 }
  3212 
  3214 
  3213 // <NEW PREDICTION>
       
  3214 
       
  3215 double G1CollectedHeap::predict_region_elapsed_time_ms(HeapRegion *hr,
  3215 double G1CollectedHeap::predict_region_elapsed_time_ms(HeapRegion *hr,
  3216                                                        bool young) {
  3216                                                        bool young) {
  3217   return _g1_policy->predict_region_elapsed_time_ms(hr, young);
  3217   return _g1_policy->predict_region_elapsed_time_ms(hr, young);
  3218 }
  3218 }
  3219 
  3219 
  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   }