< prev index next >

src/share/vm/gc/g1/concurrentG1Refine.cpp

Print this page
rev 13241 : imported patch 8183128-erikd-review


 152     size = green * 2;
 153   } else if (green < config) {
 154     size = config - green;
 155   }
 156   size = MAX2(size, min_size);
 157   size = MIN2(size, max_yellow_zone);
 158   return MIN2(green + size, max_yellow_zone);
 159 }
 160 
 161 static size_t calc_init_red_zone(size_t green, size_t yellow) {
 162   size_t size = yellow - green;
 163   if (!FLAG_IS_DEFAULT(G1ConcRefinementRedZone)) {
 164     size_t config = G1ConcRefinementRedZone;
 165     if (yellow < config) {
 166       size = MAX2(size, config - yellow);
 167     }
 168   }
 169   return MIN2(yellow + size, max_red_zone);
 170 }
 171 
 172 ConcurrentG1Refine* ConcurrentG1Refine::create(CardTableEntryClosure* refine_closure,
 173                                                jint* ecode) {
 174   size_t min_yellow_zone_size = calc_min_yellow_zone_size();
 175   size_t green_zone = calc_init_green_zone();
 176   size_t yellow_zone = calc_init_yellow_zone(green_zone, min_yellow_zone_size);
 177   size_t red_zone = calc_init_red_zone(green_zone, yellow_zone);
 178 
 179   LOG_ZONES("Initial Refinement Zones: "
 180             "green: " SIZE_FORMAT ", "
 181             "yellow: " SIZE_FORMAT ", "
 182             "red: " SIZE_FORMAT ", "
 183             "min yellow size: " SIZE_FORMAT,
 184             green_zone, yellow_zone, red_zone, min_yellow_zone_size);
 185 
 186   ConcurrentG1Refine* cg1r = new ConcurrentG1Refine(green_zone,
 187                                                     yellow_zone,
 188                                                     red_zone,
 189                                                     min_yellow_zone_size);
 190 
 191   if (cg1r == NULL) {
 192     *ecode = JNI_ENOMEM;
 193     vm_shutdown_during_initialization("Could not create ConcurrentG1Refine");
 194     return NULL;
 195   }
 196 
 197   cg1r->_threads = NEW_C_HEAP_ARRAY_RETURN_NULL(ConcurrentG1RefineThread*, cg1r->_n_worker_threads, mtGC);
 198   if (cg1r->_threads == NULL) {
 199     *ecode = JNI_ENOMEM;
 200     vm_shutdown_during_initialization("Could not allocate an array for ConcurrentG1RefineThread");
 201     return NULL;
 202   }
 203 
 204   uint worker_id_offset = DirtyCardQueueSet::num_par_ids();
 205 
 206   ConcurrentG1RefineThread *next = NULL;
 207   for (uint i = cg1r->_n_worker_threads - 1; i != UINT_MAX; i--) {
 208     Thresholds thresholds = calc_thresholds(green_zone, yellow_zone, i);
 209     ConcurrentG1RefineThread* t =
 210       new ConcurrentG1RefineThread(cg1r,
 211                                    next,
 212                                    refine_closure,
 213                                    worker_id_offset,
 214                                    i,
 215                                    activation_level(thresholds),
 216                                    deactivation_level(thresholds));
 217     assert(t != NULL, "Conc refine should have been created");
 218     if (t->osthread() == NULL) {
 219       *ecode = JNI_ENOMEM;
 220       vm_shutdown_during_initialization("Could not create ConcurrentG1RefineThread");
 221       return NULL;
 222     }
 223 
 224     assert(t->cg1r() == cg1r, "Conc refine thread should refer to this");
 225     cg1r->_threads[i] = t;
 226     next = t;
 227   }
 228 
 229   cg1r->_sample_thread = new G1YoungRemSetSamplingThread();
 230   if (cg1r->_sample_thread->osthread() == NULL) {
 231     *ecode = JNI_ENOMEM;
 232     vm_shutdown_during_initialization("Could not create G1YoungRemSetSamplingThread");




 152     size = green * 2;
 153   } else if (green < config) {
 154     size = config - green;
 155   }
 156   size = MAX2(size, min_size);
 157   size = MIN2(size, max_yellow_zone);
 158   return MIN2(green + size, max_yellow_zone);
 159 }
 160 
 161 static size_t calc_init_red_zone(size_t green, size_t yellow) {
 162   size_t size = yellow - green;
 163   if (!FLAG_IS_DEFAULT(G1ConcRefinementRedZone)) {
 164     size_t config = G1ConcRefinementRedZone;
 165     if (yellow < config) {
 166       size = MAX2(size, config - yellow);
 167     }
 168   }
 169   return MIN2(yellow + size, max_red_zone);
 170 }
 171 
 172 ConcurrentG1Refine* ConcurrentG1Refine::create(jint* ecode) {

 173   size_t min_yellow_zone_size = calc_min_yellow_zone_size();
 174   size_t green_zone = calc_init_green_zone();
 175   size_t yellow_zone = calc_init_yellow_zone(green_zone, min_yellow_zone_size);
 176   size_t red_zone = calc_init_red_zone(green_zone, yellow_zone);
 177 
 178   LOG_ZONES("Initial Refinement Zones: "
 179             "green: " SIZE_FORMAT ", "
 180             "yellow: " SIZE_FORMAT ", "
 181             "red: " SIZE_FORMAT ", "
 182             "min yellow size: " SIZE_FORMAT,
 183             green_zone, yellow_zone, red_zone, min_yellow_zone_size);
 184 
 185   ConcurrentG1Refine* cg1r = new ConcurrentG1Refine(green_zone,
 186                                                     yellow_zone,
 187                                                     red_zone,
 188                                                     min_yellow_zone_size);
 189 
 190   if (cg1r == NULL) {
 191     *ecode = JNI_ENOMEM;
 192     vm_shutdown_during_initialization("Could not create ConcurrentG1Refine");
 193     return NULL;
 194   }
 195 
 196   cg1r->_threads = NEW_C_HEAP_ARRAY_RETURN_NULL(ConcurrentG1RefineThread*, cg1r->_n_worker_threads, mtGC);
 197   if (cg1r->_threads == NULL) {
 198     *ecode = JNI_ENOMEM;
 199     vm_shutdown_during_initialization("Could not allocate an array for ConcurrentG1RefineThread");
 200     return NULL;
 201   }
 202 
 203   uint worker_id_offset = DirtyCardQueueSet::num_par_ids();
 204 
 205   ConcurrentG1RefineThread *next = NULL;
 206   for (uint i = cg1r->_n_worker_threads - 1; i != UINT_MAX; i--) {
 207     Thresholds thresholds = calc_thresholds(green_zone, yellow_zone, i);
 208     ConcurrentG1RefineThread* t =
 209       new ConcurrentG1RefineThread(cg1r,
 210                                    next,

 211                                    worker_id_offset,
 212                                    i,
 213                                    activation_level(thresholds),
 214                                    deactivation_level(thresholds));
 215     assert(t != NULL, "Conc refine should have been created");
 216     if (t->osthread() == NULL) {
 217       *ecode = JNI_ENOMEM;
 218       vm_shutdown_during_initialization("Could not create ConcurrentG1RefineThread");
 219       return NULL;
 220     }
 221 
 222     assert(t->cg1r() == cg1r, "Conc refine thread should refer to this");
 223     cg1r->_threads[i] = t;
 224     next = t;
 225   }
 226 
 227   cg1r->_sample_thread = new G1YoungRemSetSamplingThread();
 228   if (cg1r->_sample_thread->osthread() == NULL) {
 229     *ecode = JNI_ENOMEM;
 230     vm_shutdown_during_initialization("Could not create G1YoungRemSetSamplingThread");


< prev index next >