< prev index next >

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

Print this page




 822   clear_during_initial_mark_pause();
 823   _in_marking_window = false;
 824   _in_marking_window_im = false;
 825 
 826   _short_lived_surv_rate_group->start_adding_regions();
 827   // also call this on any additional surv rate groups
 828 
 829   record_survivor_regions(0, NULL, NULL);
 830 
 831   _free_regions_at_end_of_collection = _g1->num_free_regions();
 832   // Reset survivors SurvRateGroup.
 833   _survivor_surv_rate_group->reset();
 834   update_young_list_target_length();
 835   _collectionSetChooser->clear();
 836 }
 837 
 838 void G1CollectorPolicy::record_stop_world_start() {
 839   _stop_world_start = os::elapsedTime();
 840 }
 841 
 842 void G1CollectorPolicy::record_collection_pause_start(double start_time_sec) {
 843   // We only need to do this here as the policy will only be applied
 844   // to the GC we're about to start. so, no point is calculating this
 845   // every time we calculate / recalculate the target young length.
 846   update_survivors_policy();
 847 
 848   assert(_g1->used() == _g1->recalculate_used(),
 849          err_msg("sanity, used: " SIZE_FORMAT " recalculate_used: " SIZE_FORMAT,
 850                  _g1->used(), _g1->recalculate_used()));
 851 
 852   double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
 853   _trace_gen0_time_data.record_start_collection(s_w_t_ms);
 854   _stop_world_start = 0.0;
 855 
 856   record_heap_size_info_at_start(false /* full */);
 857 
 858   phase_times()->record_cur_collection_start_sec(start_time_sec);
 859   _pending_cards = _g1->pending_card_num();
 860 
 861   _collection_set_bytes_used_before = 0;
 862   _bytes_copied_during_gc = 0;
 863 
 864   _last_gc_was_young = false;
 865 
 866   // do that for any other surv rate groups


1436   uint young_list_max_length = _young_list_max_length;
1437   return young_list_length < young_list_max_length;
1438 }
1439 
1440 void G1CollectorPolicy::update_max_gc_locker_expansion() {
1441   uint expansion_region_num = 0;
1442   if (GCLockerEdenExpansionPercent > 0) {
1443     double perc = (double) GCLockerEdenExpansionPercent / 100.0;
1444     double expansion_region_num_d = perc * (double) _young_list_target_length;
1445     // We use ceiling so that if expansion_region_num_d is > 0.0 (but
1446     // less than 1.0) we'll get 1.
1447     expansion_region_num = (uint) ceil(expansion_region_num_d);
1448   } else {
1449     assert(expansion_region_num == 0, "sanity");
1450   }
1451   _young_list_max_length = _young_list_target_length + expansion_region_num;
1452   assert(_young_list_target_length <= _young_list_max_length, "post-condition");
1453 }
1454 
1455 // Calculates survivor space parameters.
1456 void G1CollectorPolicy::update_survivors_policy() {
1457   double max_survivor_regions_d =
1458                  (double) _young_list_target_length / (double) SurvivorRatio;
1459   // We use ceiling so that if max_survivor_regions_d is > 0.0 (but
1460   // smaller than 1.0) we'll get 1.
1461   _max_survivor_regions = (uint) ceil(max_survivor_regions_d);
1462 
1463   _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
1464         HeapRegion::GrainWords * _max_survivor_regions);
1465 }
1466 
1467 bool G1CollectorPolicy::force_initial_mark_if_outside_cycle(
1468                                                      GCCause::Cause gc_cause) {
1469   bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
1470   if (!during_cycle) {
1471     ergo_verbose1(ErgoConcCycles,
1472                   "request concurrent cycle initiation",
1473                   ergo_format_reason("requested by GC cause")
1474                   ergo_format_str("GC cause"),
1475                   GCCause::to_string(gc_cause));
1476     set_initiate_conc_mark_if_possible();
1477     return true;
1478   } else {
1479     ergo_verbose1(ErgoConcCycles,
1480                   "do not request concurrent cycle initiation",
1481                   ergo_format_reason("concurrent cycle already in progress")
1482                   ergo_format_str("GC cause"),
1483                   GCCause::to_string(gc_cause));
1484     return false;




 822   clear_during_initial_mark_pause();
 823   _in_marking_window = false;
 824   _in_marking_window_im = false;
 825 
 826   _short_lived_surv_rate_group->start_adding_regions();
 827   // also call this on any additional surv rate groups
 828 
 829   record_survivor_regions(0, NULL, NULL);
 830 
 831   _free_regions_at_end_of_collection = _g1->num_free_regions();
 832   // Reset survivors SurvRateGroup.
 833   _survivor_surv_rate_group->reset();
 834   update_young_list_target_length();
 835   _collectionSetChooser->clear();
 836 }
 837 
 838 void G1CollectorPolicy::record_stop_world_start() {
 839   _stop_world_start = os::elapsedTime();
 840 }
 841 
 842 void G1CollectorPolicy::record_collection_pause_start(double start_time_sec, GCTracer &tracer) {
 843   // We only need to do this here as the policy will only be applied
 844   // to the GC we're about to start. so, no point is calculating this
 845   // every time we calculate / recalculate the target young length.
 846   update_survivors_policy(tracer);
 847 
 848   assert(_g1->used() == _g1->recalculate_used(),
 849          err_msg("sanity, used: " SIZE_FORMAT " recalculate_used: " SIZE_FORMAT,
 850                  _g1->used(), _g1->recalculate_used()));
 851 
 852   double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
 853   _trace_gen0_time_data.record_start_collection(s_w_t_ms);
 854   _stop_world_start = 0.0;
 855 
 856   record_heap_size_info_at_start(false /* full */);
 857 
 858   phase_times()->record_cur_collection_start_sec(start_time_sec);
 859   _pending_cards = _g1->pending_card_num();
 860 
 861   _collection_set_bytes_used_before = 0;
 862   _bytes_copied_during_gc = 0;
 863 
 864   _last_gc_was_young = false;
 865 
 866   // do that for any other surv rate groups


1436   uint young_list_max_length = _young_list_max_length;
1437   return young_list_length < young_list_max_length;
1438 }
1439 
1440 void G1CollectorPolicy::update_max_gc_locker_expansion() {
1441   uint expansion_region_num = 0;
1442   if (GCLockerEdenExpansionPercent > 0) {
1443     double perc = (double) GCLockerEdenExpansionPercent / 100.0;
1444     double expansion_region_num_d = perc * (double) _young_list_target_length;
1445     // We use ceiling so that if expansion_region_num_d is > 0.0 (but
1446     // less than 1.0) we'll get 1.
1447     expansion_region_num = (uint) ceil(expansion_region_num_d);
1448   } else {
1449     assert(expansion_region_num == 0, "sanity");
1450   }
1451   _young_list_max_length = _young_list_target_length + expansion_region_num;
1452   assert(_young_list_target_length <= _young_list_max_length, "post-condition");
1453 }
1454 
1455 // Calculates survivor space parameters.
1456 void G1CollectorPolicy::update_survivors_policy(GCTracer &tracer) {
1457   double max_survivor_regions_d =
1458                  (double) _young_list_target_length / (double) SurvivorRatio;
1459   // We use ceiling so that if max_survivor_regions_d is > 0.0 (but
1460   // smaller than 1.0) we'll get 1.
1461   _max_survivor_regions = (uint) ceil(max_survivor_regions_d);
1462 
1463   _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
1464         HeapRegion::GrainWords * _max_survivor_regions, tracer);
1465 }
1466 
1467 bool G1CollectorPolicy::force_initial_mark_if_outside_cycle(
1468                                                      GCCause::Cause gc_cause) {
1469   bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
1470   if (!during_cycle) {
1471     ergo_verbose1(ErgoConcCycles,
1472                   "request concurrent cycle initiation",
1473                   ergo_format_reason("requested by GC cause")
1474                   ergo_format_str("GC cause"),
1475                   GCCause::to_string(gc_cause));
1476     set_initiate_conc_mark_if_possible();
1477     return true;
1478   } else {
1479     ergo_verbose1(ErgoConcCycles,
1480                   "do not request concurrent cycle initiation",
1481                   ergo_format_reason("concurrent cycle already in progress")
1482                   ergo_format_str("GC cause"),
1483                   GCCause::to_string(gc_cause));
1484     return false;


< prev index next >