194 #endif // _MSC_VER |
194 #endif // _MSC_VER |
195 |
195 |
196 _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived", |
196 _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived", |
197 G1YoungSurvRateNumRegionsSummary)), |
197 G1YoungSurvRateNumRegionsSummary)), |
198 _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor", |
198 _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor", |
199 G1YoungSurvRateNumRegionsSummary)) |
199 G1YoungSurvRateNumRegionsSummary)), |
200 // add here any more surv rate groups |
200 // add here any more surv rate groups |
|
201 _recorded_survivor_regions(0), |
|
202 _recorded_survivor_head(NULL), |
|
203 _recorded_survivor_tail(NULL), |
|
204 _survivors_age_table(true) |
|
205 |
201 { |
206 { |
202 _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime()); |
207 _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime()); |
203 _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0; |
208 _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0; |
204 |
209 |
205 _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads]; |
210 _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads]; |
270 _concurrent_mark_init_times_ms->add(0.05); |
275 _concurrent_mark_init_times_ms->add(0.05); |
271 _concurrent_mark_remark_times_ms->add(0.05); |
276 _concurrent_mark_remark_times_ms->add(0.05); |
272 _concurrent_mark_cleanup_times_ms->add(0.20); |
277 _concurrent_mark_cleanup_times_ms->add(0.20); |
273 _tenuring_threshold = MaxTenuringThreshold; |
278 _tenuring_threshold = MaxTenuringThreshold; |
274 |
279 |
|
280 if (G1UseSurvivorSpace) { |
|
281 // if G1FixedSurvivorSpaceSize is 0 which means the size is not |
|
282 // fixed, then _max_survivor_regions will be calculated at |
|
283 // calculate_young_list_target_config diring initialization |
|
284 _max_survivor_regions = G1FixedSurvivorSpaceSize / HeapRegion::GrainBytes; |
|
285 } else { |
|
286 _max_survivor_regions = 0; |
|
287 } |
|
288 |
275 initialize_all(); |
289 initialize_all(); |
276 } |
290 } |
277 |
291 |
278 // Increment "i", mod "len" |
292 // Increment "i", mod "len" |
279 static void inc_mod(int& i, int len) { |
293 static void inc_mod(int& i, int len) { |
298 } |
312 } |
299 if (UseConcMarkSweepGC) { |
313 if (UseConcMarkSweepGC) { |
300 vm_exit_during_initialization("-XX:+UseG1GC is incompatible with " |
314 vm_exit_during_initialization("-XX:+UseG1GC is incompatible with " |
301 "-XX:+UseConcMarkSweepGC."); |
315 "-XX:+UseConcMarkSweepGC."); |
302 } |
316 } |
|
317 |
|
318 initialize_gc_policy_counters(); |
303 |
319 |
304 if (G1Gen) { |
320 if (G1Gen) { |
305 _in_young_gc_mode = true; |
321 _in_young_gc_mode = true; |
306 |
322 |
307 if (G1YoungGenSize == 0) { |
323 if (G1YoungGenSize == 0) { |
318 calculate_young_list_target_config(); |
334 calculate_young_list_target_config(); |
319 } else { |
335 } else { |
320 _young_list_fixed_length = 0; |
336 _young_list_fixed_length = 0; |
321 _in_young_gc_mode = false; |
337 _in_young_gc_mode = false; |
322 } |
338 } |
|
339 } |
|
340 |
|
341 // Create the jstat counters for the policy. |
|
342 void G1CollectorPolicy::initialize_gc_policy_counters() |
|
343 { |
|
344 _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 2 + G1Gen); |
323 } |
345 } |
324 |
346 |
325 void G1CollectorPolicy::calculate_young_list_min_length() { |
347 void G1CollectorPolicy::calculate_young_list_min_length() { |
326 _young_list_min_length = 0; |
348 _young_list_min_length = 0; |
327 |
349 |
350 _young_list_target_length = MAX2(_young_list_target_length, (size_t)1); |
372 _young_list_target_length = MAX2(_young_list_target_length, (size_t)1); |
351 size_t so_length = calculate_optimal_so_length(_young_list_target_length); |
373 size_t so_length = calculate_optimal_so_length(_young_list_target_length); |
352 guarantee( so_length < _young_list_target_length, "invariant" ); |
374 guarantee( so_length < _young_list_target_length, "invariant" ); |
353 _young_list_so_prefix_length = so_length; |
375 _young_list_so_prefix_length = so_length; |
354 } |
376 } |
|
377 calculate_survivors_policy(); |
355 } |
378 } |
356 |
379 |
357 // This method calculate the optimal scan-only set for a fixed young |
380 // This method calculate the optimal scan-only set for a fixed young |
358 // gen size. I couldn't work out how to reuse the more elaborate one, |
381 // gen size. I couldn't work out how to reuse the more elaborate one, |
359 // i.e. calculate_young_list_target_config(rs_length), as the loops are |
382 // i.e. calculate_young_list_target_config(rs_length), as the loops are |
445 size_t reserve_regions = |
468 size_t reserve_regions = |
446 (size_t) ((double) min_reserve_perc * (double) _g1->n_regions() / 100.0); |
469 (size_t) ((double) min_reserve_perc * (double) _g1->n_regions() / 100.0); |
447 |
470 |
448 if (full_young_gcs() && _free_regions_at_end_of_collection > 0) { |
471 if (full_young_gcs() && _free_regions_at_end_of_collection > 0) { |
449 // we are in fully-young mode and there are free regions in the heap |
472 // we are in fully-young mode and there are free regions in the heap |
|
473 |
|
474 double survivor_regions_evac_time = |
|
475 predict_survivor_regions_evac_time(); |
450 |
476 |
451 size_t min_so_length = 0; |
477 size_t min_so_length = 0; |
452 size_t max_so_length = 0; |
478 size_t max_so_length = 0; |
453 |
479 |
454 if (G1UseScanOnlyPrefix) { |
480 if (G1UseScanOnlyPrefix) { |
495 scanned_cards = predict_young_card_num(adj_rs_lengths); |
521 scanned_cards = predict_young_card_num(adj_rs_lengths); |
496 else |
522 else |
497 scanned_cards = predict_non_young_card_num(adj_rs_lengths); |
523 scanned_cards = predict_non_young_card_num(adj_rs_lengths); |
498 // calculate this once, so that we don't have to recalculate it in |
524 // calculate this once, so that we don't have to recalculate it in |
499 // the innermost loop |
525 // the innermost loop |
500 double base_time_ms = predict_base_elapsed_time_ms(pending_cards, |
526 double base_time_ms = predict_base_elapsed_time_ms(pending_cards, scanned_cards) |
501 scanned_cards); |
527 + survivor_regions_evac_time; |
502 |
|
503 // the result |
528 // the result |
504 size_t final_young_length = 0; |
529 size_t final_young_length = 0; |
505 size_t final_so_length = 0; |
530 size_t final_so_length = 0; |
506 double final_gc_eff = 0.0; |
531 double final_gc_eff = 0.0; |
507 // we'll also keep track of how many times we go into the inner loop |
532 // we'll also keep track of how many times we go into the inner loop |
546 } |
571 } |
547 |
572 |
548 bool done = false; |
573 bool done = false; |
549 // this is the outermost loop |
574 // this is the outermost loop |
550 while (!done) { |
575 while (!done) { |
551 #if 0 |
576 #ifdef TRACE_CALC_YOUNG_CONFIG |
552 // leave this in for debugging, just in case |
577 // leave this in for debugging, just in case |
553 gclog_or_tty->print_cr("searching between " SIZE_FORMAT " and " SIZE_FORMAT |
578 gclog_or_tty->print_cr("searching between " SIZE_FORMAT " and " SIZE_FORMAT |
554 ", incr " SIZE_FORMAT ", pass %s", |
579 ", incr " SIZE_FORMAT ", pass %s", |
555 from_so_length, to_so_length, so_length_incr, |
580 from_so_length, to_so_length, so_length_incr, |
556 (pass == pass_type_coarse) ? "coarse" : |
581 (pass == pass_type_coarse) ? "coarse" : |
557 (pass == pass_type_fine) ? "fine" : "final"); |
582 (pass == pass_type_fine) ? "fine" : "final"); |
558 #endif // 0 |
583 #endif // TRACE_CALC_YOUNG_CONFIG |
559 |
584 |
560 size_t so_length = from_so_length; |
585 size_t so_length = from_so_length; |
561 size_t init_free_regions = |
586 size_t init_free_regions = |
562 MAX2((size_t)0, |
587 MAX2((size_t)0, |
563 _free_regions_at_end_of_collection + |
588 _free_regions_at_end_of_collection + |
649 // S-O lengths around that config with a fine increment. |
674 // S-O lengths around that config with a fine increment. |
650 |
675 |
651 guarantee( so_length_incr == so_coarse_increments, "invariant" ); |
676 guarantee( so_length_incr == so_coarse_increments, "invariant" ); |
652 guarantee( final_so_length >= min_so_length, "invariant" ); |
677 guarantee( final_so_length >= min_so_length, "invariant" ); |
653 |
678 |
654 #if 0 |
679 #ifdef TRACE_CALC_YOUNG_CONFIG |
655 // leave this in for debugging, just in case |
680 // leave this in for debugging, just in case |
656 gclog_or_tty->print_cr(" coarse pass: SO length " SIZE_FORMAT, |
681 gclog_or_tty->print_cr(" coarse pass: SO length " SIZE_FORMAT, |
657 final_so_length); |
682 final_so_length); |
658 #endif // 0 |
683 #endif // TRACE_CALC_YOUNG_CONFIG |
659 |
684 |
660 from_so_length = |
685 from_so_length = |
661 (final_so_length - min_so_length > so_coarse_increments) ? |
686 (final_so_length - min_so_length > so_coarse_increments) ? |
662 final_so_length - so_coarse_increments + 1 : min_so_length; |
687 final_so_length - so_coarse_increments + 1 : min_so_length; |
663 to_so_length = |
688 to_so_length = |
685 } else { |
710 } else { |
686 // we'll go around once more, setting the S-O length to 95% |
711 // we'll go around once more, setting the S-O length to 95% |
687 // of the optimal |
712 // of the optimal |
688 size_t new_so_length = 950 * final_so_length / 1000; |
713 size_t new_so_length = 950 * final_so_length / 1000; |
689 |
714 |
690 #if 0 |
715 #ifdef TRACE_CALC_YOUNG_CONFIG |
691 // leave this in for debugging, just in case |
716 // leave this in for debugging, just in case |
692 gclog_or_tty->print_cr(" fine pass: SO length " SIZE_FORMAT |
717 gclog_or_tty->print_cr(" fine pass: SO length " SIZE_FORMAT |
693 ", setting it to " SIZE_FORMAT, |
718 ", setting it to " SIZE_FORMAT, |
694 final_so_length, new_so_length); |
719 final_so_length, new_so_length); |
695 #endif // 0 |
720 #endif // TRACE_CALC_YOUNG_CONFIG |
696 |
721 |
697 from_so_length = new_so_length; |
722 from_so_length = new_so_length; |
698 to_so_length = new_so_length; |
723 to_so_length = new_so_length; |
699 fine_so_length = final_so_length; |
724 fine_so_length = final_so_length; |
700 |
725 |
717 |
742 |
718 // we now go around the outermost loop |
743 // we now go around the outermost loop |
719 } |
744 } |
720 |
745 |
721 // we should have at least one region in the target young length |
746 // we should have at least one region in the target young length |
722 _young_list_target_length = MAX2((size_t) 1, final_young_length); |
747 _young_list_target_length = |
|
748 MAX2((size_t) 1, final_young_length + _recorded_survivor_regions); |
723 if (final_so_length >= final_young_length) |
749 if (final_so_length >= final_young_length) |
724 // and we need to ensure that the S-O length is not greater than |
750 // and we need to ensure that the S-O length is not greater than |
725 // the target young length (this is being a bit careful) |
751 // the target young length (this is being a bit careful) |
726 final_so_length = 0; |
752 final_so_length = 0; |
727 _young_list_so_prefix_length = final_so_length; |
753 _young_list_so_prefix_length = final_so_length; |
732 // right now, I assume that we'll print it when we need it; we |
758 // right now, I assume that we'll print it when we need it; we |
733 // should really adde it to the breakdown of a pause |
759 // should really adde it to the breakdown of a pause |
734 double end_time_sec = os::elapsedTime(); |
760 double end_time_sec = os::elapsedTime(); |
735 double elapsed_time_ms = (end_time_sec - start_time_sec) * 1000.0; |
761 double elapsed_time_ms = (end_time_sec - start_time_sec) * 1000.0; |
736 |
762 |
737 #if 0 |
763 #ifdef TRACE_CALC_YOUNG_CONFIG |
738 // leave this in for debugging, just in case |
764 // leave this in for debugging, just in case |
739 gclog_or_tty->print_cr("target = %1.1lf ms, young = " SIZE_FORMAT |
765 gclog_or_tty->print_cr("target = %1.1lf ms, young = " SIZE_FORMAT |
740 ", SO = " SIZE_FORMAT ", " |
766 ", SO = " SIZE_FORMAT ", " |
741 "elapsed %1.2lf ms, calcs: " SIZE_FORMAT " (%s%s) " |
767 "elapsed %1.2lf ms, calcs: " SIZE_FORMAT " (%s%s) " |
742 SIZE_FORMAT SIZE_FORMAT, |
768 SIZE_FORMAT SIZE_FORMAT, |
745 _young_list_so_prefix_length, |
771 _young_list_so_prefix_length, |
746 elapsed_time_ms, |
772 elapsed_time_ms, |
747 calculations, |
773 calculations, |
748 full_young_gcs() ? "full" : "partial", |
774 full_young_gcs() ? "full" : "partial", |
749 should_initiate_conc_mark() ? " i-m" : "", |
775 should_initiate_conc_mark() ? " i-m" : "", |
750 in_marking_window(), |
776 _in_marking_window, |
751 in_marking_window_im()); |
777 _in_marking_window_im); |
752 #endif // 0 |
778 #endif // TRACE_CALC_YOUNG_CONFIG |
753 |
779 |
754 if (_young_list_target_length < _young_list_min_length) { |
780 if (_young_list_target_length < _young_list_min_length) { |
755 // bummer; this means that, if we do a pause when the optimal |
781 // bummer; this means that, if we do a pause when the optimal |
756 // config dictates, we'll violate the pause spacing target (the |
782 // config dictates, we'll violate the pause spacing target (the |
757 // min length was calculate based on the application's current |
783 // min length was calculate based on the application's current |
766 if (!_in_marking_window && !_last_full_young_gc) |
792 if (!_in_marking_window && !_last_full_young_gc) |
767 // but we can still try to see whether we can find an optimal |
793 // but we can still try to see whether we can find an optimal |
768 // S-O length |
794 // S-O length |
769 so_length = calculate_optimal_so_length(_young_list_min_length); |
795 so_length = calculate_optimal_so_length(_young_list_min_length); |
770 |
796 |
771 #if 0 |
797 #ifdef TRACE_CALC_YOUNG_CONFIG |
772 // leave this in for debugging, just in case |
798 // leave this in for debugging, just in case |
773 gclog_or_tty->print_cr("adjusted target length from " |
799 gclog_or_tty->print_cr("adjusted target length from " |
774 SIZE_FORMAT " to " SIZE_FORMAT |
800 SIZE_FORMAT " to " SIZE_FORMAT |
775 ", SO " SIZE_FORMAT, |
801 ", SO " SIZE_FORMAT, |
776 _young_list_target_length, _young_list_min_length, |
802 _young_list_target_length, _young_list_min_length, |
777 so_length); |
803 so_length); |
778 #endif // 0 |
804 #endif // TRACE_CALC_YOUNG_CONFIG |
779 |
805 |
780 _young_list_target_length = |
806 _young_list_target_length = |
781 MAX2(_young_list_min_length, (size_t)1); |
807 MAX2(_young_list_min_length, (size_t)1); |
782 _young_list_so_prefix_length = so_length; |
808 _young_list_so_prefix_length = so_length; |
783 } |
809 } |
784 } else { |
810 } else { |
785 // we are in a partially-young mode or we've run out of regions (due |
811 // we are in a partially-young mode or we've run out of regions (due |
786 // to evacuation failure) |
812 // to evacuation failure) |
787 |
813 |
788 #if 0 |
814 #ifdef TRACE_CALC_YOUNG_CONFIG |
789 // leave this in for debugging, just in case |
815 // leave this in for debugging, just in case |
790 gclog_or_tty->print_cr("(partial) setting target to " SIZE_FORMAT |
816 gclog_or_tty->print_cr("(partial) setting target to " SIZE_FORMAT |
791 ", SO " SIZE_FORMAT, |
817 ", SO " SIZE_FORMAT, |
792 _young_list_min_length, 0); |
818 _young_list_min_length, 0); |
793 #endif // 0 |
819 #endif // TRACE_CALC_YOUNG_CONFIG |
794 |
820 |
795 // we'll do the pause as soon as possible and with no S-O prefix |
821 // we'll do the pause as soon as possible and with no S-O prefix |
796 // (see above for the reasons behind the latter) |
822 // (see above for the reasons behind the latter) |
797 _young_list_target_length = |
823 _young_list_target_length = |
798 MAX2(_young_list_min_length, (size_t) 1); |
824 MAX2(_young_list_min_length, (size_t) 1); |
882 *ret_gc_eff = gc_eff; |
908 *ret_gc_eff = gc_eff; |
883 |
909 |
884 return true; |
910 return true; |
885 } |
911 } |
886 |
912 |
|
913 double G1CollectorPolicy::predict_survivor_regions_evac_time() { |
|
914 double survivor_regions_evac_time = 0.0; |
|
915 for (HeapRegion * r = _recorded_survivor_head; |
|
916 r != NULL && r != _recorded_survivor_tail->get_next_young_region(); |
|
917 r = r->get_next_young_region()) { |
|
918 survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true); |
|
919 } |
|
920 return survivor_regions_evac_time; |
|
921 } |
|
922 |
887 void G1CollectorPolicy::check_prediction_validity() { |
923 void G1CollectorPolicy::check_prediction_validity() { |
888 guarantee( adaptive_young_list_length(), "should not call this otherwise" ); |
924 guarantee( adaptive_young_list_length(), "should not call this otherwise" ); |
889 |
925 |
890 size_t rs_lengths = _g1->young_list_sampled_rs_lengths(); |
926 size_t rs_lengths = _g1->young_list_sampled_rs_lengths(); |
891 if (rs_lengths > _rs_lengths_prediction) { |
927 if (rs_lengths > _rs_lengths_prediction) { |
993 |
1029 |
994 _short_lived_surv_rate_group->record_scan_only_prefix(0); |
1030 _short_lived_surv_rate_group->record_scan_only_prefix(0); |
995 _short_lived_surv_rate_group->start_adding_regions(); |
1031 _short_lived_surv_rate_group->start_adding_regions(); |
996 // also call this on any additional surv rate groups |
1032 // also call this on any additional surv rate groups |
997 |
1033 |
|
1034 record_survivor_regions(0, NULL, NULL); |
|
1035 |
998 _prev_region_num_young = _region_num_young; |
1036 _prev_region_num_young = _region_num_young; |
999 _prev_region_num_tenured = _region_num_tenured; |
1037 _prev_region_num_tenured = _region_num_tenured; |
1000 |
1038 |
1001 _free_regions_at_end_of_collection = _g1->free_regions(); |
1039 _free_regions_at_end_of_collection = _g1->free_regions(); |
1002 _scan_only_regions_at_end_of_collection = 0; |
1040 _scan_only_regions_at_end_of_collection = 0; |
|
1041 // Reset survivors SurvRateGroup. |
|
1042 _survivor_surv_rate_group->reset(); |
1003 calculate_young_list_min_length(); |
1043 calculate_young_list_min_length(); |
1004 calculate_young_list_target_config(); |
1044 calculate_young_list_target_config(); |
1005 } |
1045 } |
1006 |
1046 |
1007 void G1CollectorPolicy::record_pop_compute_rc_start() { |
1047 void G1CollectorPolicy::record_pop_compute_rc_start() { |
1101 // do that for any other surv rate groups |
1141 // do that for any other surv rate groups |
1102 _short_lived_surv_rate_group->stop_adding_regions(); |
1142 _short_lived_surv_rate_group->stop_adding_regions(); |
1103 size_t short_lived_so_length = _young_list_so_prefix_length; |
1143 size_t short_lived_so_length = _young_list_so_prefix_length; |
1104 _short_lived_surv_rate_group->record_scan_only_prefix(short_lived_so_length); |
1144 _short_lived_surv_rate_group->record_scan_only_prefix(short_lived_so_length); |
1105 tag_scan_only(short_lived_so_length); |
1145 tag_scan_only(short_lived_so_length); |
|
1146 |
|
1147 if (G1UseSurvivorSpace) { |
|
1148 _survivors_age_table.clear(); |
|
1149 } |
1106 |
1150 |
1107 assert( verify_young_ages(), "region age verification" ); |
1151 assert( verify_young_ages(), "region age verification" ); |
1108 } |
1152 } |
1109 |
1153 |
1110 void G1CollectorPolicy::tag_scan_only(size_t short_lived_scan_only_length) { |
1154 void G1CollectorPolicy::tag_scan_only(size_t short_lived_scan_only_length) { |
2056 bytes_to_copy = hr->max_live_bytes(); |
2097 bytes_to_copy = hr->max_live_bytes(); |
2057 else { |
2098 else { |
2058 guarantee( hr->is_young() && hr->age_in_surv_rate_group() != -1, |
2099 guarantee( hr->is_young() && hr->age_in_surv_rate_group() != -1, |
2059 "invariant" ); |
2100 "invariant" ); |
2060 int age = hr->age_in_surv_rate_group(); |
2101 int age = hr->age_in_surv_rate_group(); |
2061 double yg_surv_rate = predict_yg_surv_rate(age); |
2102 double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group()); |
2062 bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate); |
2103 bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate); |
2063 } |
2104 } |
2064 |
2105 |
2065 return bytes_to_copy; |
2106 return bytes_to_copy; |
2066 } |
2107 } |
2089 } else { |
2130 } else { |
2090 ++_recorded_non_young_regions; |
2131 ++_recorded_non_young_regions; |
2091 } |
2132 } |
2092 #if PREDICTIONS_VERBOSE |
2133 #if PREDICTIONS_VERBOSE |
2093 if (young) { |
2134 if (young) { |
2094 _recorded_young_bytes += hr->asSpace()->used(); |
2135 _recorded_young_bytes += hr->used(); |
2095 } else { |
2136 } else { |
2096 _recorded_marked_bytes += hr->max_live_bytes(); |
2137 _recorded_marked_bytes += hr->max_live_bytes(); |
2097 } |
2138 } |
2098 _predicted_bytes_to_copy += predict_bytes_to_copy(hr); |
2139 _predicted_bytes_to_copy += predict_bytes_to_copy(hr); |
2099 #endif // PREDICTIONS_VERBOSE |
2140 #endif // PREDICTIONS_VERBOSE |
2116 _predicted_cards_scanned += predict_young_card_num(_predicted_rs_lengths); |
2157 _predicted_cards_scanned += predict_young_card_num(_predicted_rs_lengths); |
2117 else |
2158 else |
2118 _predicted_cards_scanned += |
2159 _predicted_cards_scanned += |
2119 predict_non_young_card_num(_predicted_rs_lengths); |
2160 predict_non_young_card_num(_predicted_rs_lengths); |
2120 _recorded_region_num = _recorded_young_regions + _recorded_non_young_regions; |
2161 _recorded_region_num = _recorded_young_regions + _recorded_non_young_regions; |
2121 |
|
2122 _predicted_young_survival_ratio = 0.0; |
|
2123 for (int i = 0; i < _recorded_young_regions; ++i) |
|
2124 _predicted_young_survival_ratio += predict_yg_surv_rate(i); |
|
2125 _predicted_young_survival_ratio /= (double) _recorded_young_regions; |
|
2126 |
2162 |
2127 _predicted_scan_only_scan_time_ms = |
2163 _predicted_scan_only_scan_time_ms = |
2128 predict_scan_only_time_ms(_recorded_scan_only_regions); |
2164 predict_scan_only_time_ms(_recorded_scan_only_regions); |
2129 _predicted_rs_update_time_ms = |
2165 _predicted_rs_update_time_ms = |
2130 predict_rs_update_time_ms(_g1->pending_card_num()); |
2166 predict_rs_update_time_ms(_g1->pending_card_num()); |
2671 bool |
2707 bool |
2672 G1CollectorPolicy::should_add_next_region_to_young_list() { |
2708 G1CollectorPolicy::should_add_next_region_to_young_list() { |
2673 assert(in_young_gc_mode(), "should be in young GC mode"); |
2709 assert(in_young_gc_mode(), "should be in young GC mode"); |
2674 bool ret; |
2710 bool ret; |
2675 size_t young_list_length = _g1->young_list_length(); |
2711 size_t young_list_length = _g1->young_list_length(); |
2676 |
2712 size_t young_list_max_length = _young_list_target_length; |
2677 if (young_list_length < _young_list_target_length) { |
2713 if (G1FixedEdenSize) { |
|
2714 young_list_max_length -= _max_survivor_regions; |
|
2715 } |
|
2716 if (young_list_length < young_list_max_length) { |
2678 ret = true; |
2717 ret = true; |
2679 ++_region_num_young; |
2718 ++_region_num_young; |
2680 } else { |
2719 } else { |
2681 ret = false; |
2720 ret = false; |
2682 ++_region_num_tenured; |
2721 ++_region_num_tenured; |
2708 conc_overhead, _mmu_tracker->max_gc_time()); |
2747 conc_overhead, _mmu_tracker->max_gc_time()); |
2709 #endif |
2748 #endif |
2710 } |
2749 } |
2711 |
2750 |
2712 |
2751 |
2713 uint G1CollectorPolicy::max_regions(int purpose) { |
2752 size_t G1CollectorPolicy::max_regions(int purpose) { |
2714 switch (purpose) { |
2753 switch (purpose) { |
2715 case GCAllocForSurvived: |
2754 case GCAllocForSurvived: |
2716 return G1MaxSurvivorRegions; |
2755 return _max_survivor_regions; |
2717 case GCAllocForTenured: |
2756 case GCAllocForTenured: |
2718 return UINT_MAX; |
2757 return REGIONS_UNLIMITED; |
2719 default: |
2758 default: |
2720 return UINT_MAX; |
2759 ShouldNotReachHere(); |
|
2760 return REGIONS_UNLIMITED; |
2721 }; |
2761 }; |
2722 } |
2762 } |
|
2763 |
|
2764 // Calculates survivor space parameters. |
|
2765 void G1CollectorPolicy::calculate_survivors_policy() |
|
2766 { |
|
2767 if (!G1UseSurvivorSpace) { |
|
2768 return; |
|
2769 } |
|
2770 if (G1FixedSurvivorSpaceSize == 0) { |
|
2771 _max_survivor_regions = _young_list_target_length / SurvivorRatio; |
|
2772 } else { |
|
2773 _max_survivor_regions = G1FixedSurvivorSpaceSize; |
|
2774 } |
|
2775 |
|
2776 if (G1FixedTenuringThreshold) { |
|
2777 _tenuring_threshold = MaxTenuringThreshold; |
|
2778 } else { |
|
2779 _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold( |
|
2780 HeapRegion::GrainWords * _max_survivor_regions); |
|
2781 } |
|
2782 } |
|
2783 |
2723 |
2784 |
2724 void |
2785 void |
2725 G1CollectorPolicy_BestRegionsFirst:: |
2786 G1CollectorPolicy_BestRegionsFirst:: |
2726 set_single_region_collection_set(HeapRegion* hr) { |
2787 set_single_region_collection_set(HeapRegion* hr) { |
2727 G1CollectorPolicy::set_single_region_collection_set(hr); |
2788 G1CollectorPolicy::set_single_region_collection_set(hr); |
2741 size_t used = _g1->used(); |
2802 size_t used = _g1->used(); |
2742 |
2803 |
2743 double max_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0; |
2804 double max_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0; |
2744 |
2805 |
2745 size_t young_list_length = _g1->young_list_length(); |
2806 size_t young_list_length = _g1->young_list_length(); |
2746 bool reached_target_length = young_list_length >= _young_list_target_length; |
2807 size_t young_list_max_length = _young_list_target_length; |
|
2808 if (G1FixedEdenSize) { |
|
2809 young_list_max_length -= _max_survivor_regions; |
|
2810 } |
|
2811 bool reached_target_length = young_list_length >= young_list_max_length; |
2747 |
2812 |
2748 if (in_young_gc_mode()) { |
2813 if (in_young_gc_mode()) { |
2749 if (reached_target_length) { |
2814 if (reached_target_length) { |
2750 assert( young_list_length > 0 && _g1->young_list_length() > 0, |
2815 assert( young_list_length > 0 && _g1->young_list_length() > 0, |
2751 "invariant" ); |
2816 "invariant" ); |