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; |