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

changeset 3998
7383557659bd
parent 3957
a2f7274eb6ef
child 4015
bb3f6194fedb
equal deleted inserted replaced
3997:f99a36499b8c 3998:7383557659bd
88 _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), 88 _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
89 _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), 89 _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
90 90
91 _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)), 91 _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
92 _prev_collection_pause_end_ms(0.0), 92 _prev_collection_pause_end_ms(0.0),
93 _pending_card_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
94 _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)), 93 _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
95 _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)), 94 _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
96 _young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)), 95 _young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
97 _mixed_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)), 96 _mixed_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
98 _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)), 97 _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
195 194
196 _phase_times = new G1GCPhaseTimes(_parallel_gc_threads); 195 _phase_times = new G1GCPhaseTimes(_parallel_gc_threads);
197 196
198 int index = MIN2(_parallel_gc_threads - 1, 7); 197 int index = MIN2(_parallel_gc_threads - 1, 7);
199 198
200 _pending_card_diff_seq->add(0.0);
201 _rs_length_diff_seq->add(rs_length_diff_defaults[index]); 199 _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
202 _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]); 200 _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]);
203 _young_cards_per_entry_ratio_seq->add( 201 _young_cards_per_entry_ratio_seq->add(
204 young_cards_per_entry_ratio_defaults[index]); 202 young_cards_per_entry_ratio_defaults[index]);
205 _cost_per_entry_ms_seq->add(cost_per_entry_ms_defaults[index]); 203 _cost_per_entry_ms_seq->add(cost_per_entry_ms_defaults[index]);
655 double G1CollectorPolicy::predict_survivor_regions_evac_time() { 653 double G1CollectorPolicy::predict_survivor_regions_evac_time() {
656 double survivor_regions_evac_time = 0.0; 654 double survivor_regions_evac_time = 0.0;
657 for (HeapRegion * r = _recorded_survivor_head; 655 for (HeapRegion * r = _recorded_survivor_head;
658 r != NULL && r != _recorded_survivor_tail->get_next_young_region(); 656 r != NULL && r != _recorded_survivor_tail->get_next_young_region();
659 r = r->get_next_young_region()) { 657 r = r->get_next_young_region()) {
660 survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true); 658 survivor_regions_evac_time += predict_region_elapsed_time_ms(r, gcs_are_young());
661 } 659 }
662 return survivor_regions_evac_time; 660 return survivor_regions_evac_time;
663 } 661 }
664 662
665 void G1CollectorPolicy::revise_young_list_target_length_if_necessary() { 663 void G1CollectorPolicy::revise_young_list_target_length_if_necessary() {
799 797
800 phase_times()->_cur_collection_start_sec = start_time_sec; 798 phase_times()->_cur_collection_start_sec = start_time_sec;
801 _cur_collection_pause_used_at_start_bytes = start_used; 799 _cur_collection_pause_used_at_start_bytes = start_used;
802 _cur_collection_pause_used_regions_at_start = _g1->used_regions(); 800 _cur_collection_pause_used_regions_at_start = _g1->used_regions();
803 _pending_cards = _g1->pending_card_num(); 801 _pending_cards = _g1->pending_card_num();
804 _max_pending_cards = _g1->max_pending_card_num(); 802
805 803 _collection_set_bytes_used_before = 0;
806 _bytes_in_collection_set_before_gc = 0;
807 _bytes_copied_during_gc = 0; 804 _bytes_copied_during_gc = 0;
808 805
809 YoungList* young_list = _g1->young_list(); 806 YoungList* young_list = _g1->young_list();
810 _eden_bytes_before_gc = young_list->eden_used_bytes(); 807 _eden_bytes_before_gc = young_list->eden_used_bytes();
811 _survivor_bytes_before_gc = young_list->survivor_used_bytes(); 808 _survivor_bytes_before_gc = young_list->survivor_used_bytes();
1034 1031
1035 _short_lived_surv_rate_group->start_adding_regions(); 1032 _short_lived_surv_rate_group->start_adding_regions();
1036 // do that for any other surv rate groupsx 1033 // do that for any other surv rate groupsx
1037 1034
1038 if (update_stats) { 1035 if (update_stats) {
1039 size_t diff = 0;
1040 if (_max_pending_cards >= _pending_cards) {
1041 diff = _max_pending_cards - _pending_cards;
1042 }
1043 _pending_card_diff_seq->add((double) diff);
1044
1045 double cost_per_card_ms = 0.0; 1036 double cost_per_card_ms = 0.0;
1046 if (_pending_cards > 0) { 1037 if (_pending_cards > 0) {
1047 cost_per_card_ms = phase_times()->_update_rs_time / (double) _pending_cards; 1038 cost_per_card_ms = phase_times()->_update_rs_time / (double) _pending_cards;
1048 _cost_per_card_ms_seq->add(cost_per_card_ms); 1039 _cost_per_card_ms_seq->add(cost_per_card_ms);
1049 } 1040 }
1124 double constant_other_time_ms = all_other_time_ms - 1115 double constant_other_time_ms = all_other_time_ms -
1125 (young_other_time_ms + non_young_other_time_ms); 1116 (young_other_time_ms + non_young_other_time_ms);
1126 _constant_other_time_ms_seq->add(constant_other_time_ms); 1117 _constant_other_time_ms_seq->add(constant_other_time_ms);
1127 1118
1128 double survival_ratio = 0.0; 1119 double survival_ratio = 0.0;
1129 if (_bytes_in_collection_set_before_gc > 0) { 1120 if (_collection_set_bytes_used_before > 0) {
1130 survival_ratio = (double) _bytes_copied_during_gc / 1121 survival_ratio = (double) _bytes_copied_during_gc /
1131 (double) _bytes_in_collection_set_before_gc; 1122 (double) _collection_set_bytes_used_before;
1132 } 1123 }
1133 1124
1134 _pending_cards_seq->add((double) _pending_cards); 1125 _pending_cards_seq->add((double) _pending_cards);
1135 _rs_lengths_seq->add((double) _max_rs_lengths); 1126 _rs_lengths_seq->add((double) _max_rs_lengths);
1136 } 1127 }
1227 } 1218 }
1228 dcqs.notify_if_necessary(); 1219 dcqs.notify_if_necessary();
1229 } 1220 }
1230 1221
1231 double 1222 double
1223 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
1224 size_t scanned_cards) {
1225 return
1226 predict_rs_update_time_ms(pending_cards) +
1227 predict_rs_scan_time_ms(scanned_cards) +
1228 predict_constant_other_time_ms();
1229 }
1230
1231 double
1232 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) { 1232 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) {
1233 size_t rs_length = predict_rs_length_diff(); 1233 size_t rs_length = predict_rs_length_diff();
1234 size_t card_num; 1234 size_t card_num;
1235 if (gcs_are_young()) { 1235 if (gcs_are_young()) {
1236 card_num = predict_young_card_num(rs_length); 1236 card_num = predict_young_card_num(rs_length);
1237 } else { 1237 } else {
1238 card_num = predict_non_young_card_num(rs_length); 1238 card_num = predict_non_young_card_num(rs_length);
1239 } 1239 }
1240 return predict_base_elapsed_time_ms(pending_cards, card_num); 1240 return predict_base_elapsed_time_ms(pending_cards, card_num);
1241 }
1242
1243 double
1244 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
1245 size_t scanned_cards) {
1246 return
1247 predict_rs_update_time_ms(pending_cards) +
1248 predict_rs_scan_time_ms(scanned_cards) +
1249 predict_constant_other_time_ms();
1250 }
1251
1252 double
1253 G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
1254 bool young) {
1255 size_t rs_length = hr->rem_set()->occupied();
1256 size_t card_num;
1257 if (gcs_are_young()) {
1258 card_num = predict_young_card_num(rs_length);
1259 } else {
1260 card_num = predict_non_young_card_num(rs_length);
1261 }
1262 size_t bytes_to_copy = predict_bytes_to_copy(hr);
1263
1264 double region_elapsed_time_ms =
1265 predict_rs_scan_time_ms(card_num) +
1266 predict_object_copy_time_ms(bytes_to_copy);
1267
1268 if (young)
1269 region_elapsed_time_ms += predict_young_other_time_ms(1);
1270 else
1271 region_elapsed_time_ms += predict_non_young_other_time_ms(1);
1272
1273 return region_elapsed_time_ms;
1274 } 1241 }
1275 1242
1276 size_t G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) { 1243 size_t G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
1277 size_t bytes_to_copy; 1244 size_t bytes_to_copy;
1278 if (hr->is_marked()) 1245 if (hr->is_marked())
1282 int age = hr->age_in_surv_rate_group(); 1249 int age = hr->age_in_surv_rate_group();
1283 double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group()); 1250 double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group());
1284 bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate); 1251 bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate);
1285 } 1252 }
1286 return bytes_to_copy; 1253 return bytes_to_copy;
1254 }
1255
1256 double
1257 G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
1258 bool for_young_gc) {
1259 size_t rs_length = hr->rem_set()->occupied();
1260 size_t card_num;
1261
1262 // Predicting the number of cards is based on which type of GC
1263 // we're predicting for.
1264 if (for_young_gc) {
1265 card_num = predict_young_card_num(rs_length);
1266 } else {
1267 card_num = predict_non_young_card_num(rs_length);
1268 }
1269 size_t bytes_to_copy = predict_bytes_to_copy(hr);
1270
1271 double region_elapsed_time_ms =
1272 predict_rs_scan_time_ms(card_num) +
1273 predict_object_copy_time_ms(bytes_to_copy);
1274
1275 // The prediction of the "other" time for this region is based
1276 // upon the region type and NOT the GC type.
1277 if (hr->is_young()) {
1278 region_elapsed_time_ms += predict_young_other_time_ms(1);
1279 } else {
1280 region_elapsed_time_ms += predict_non_young_other_time_ms(1);
1281 }
1282 return region_elapsed_time_ms;
1287 } 1283 }
1288 1284
1289 void 1285 void
1290 G1CollectorPolicy::init_cset_region_lengths(uint eden_cset_region_length, 1286 G1CollectorPolicy::init_cset_region_lengths(uint eden_cset_region_length,
1291 uint survivor_cset_region_length) { 1287 uint survivor_cset_region_length) {
1338 1334
1339 return expand_bytes; 1335 return expand_bytes;
1340 } else { 1336 } else {
1341 return 0; 1337 return 0;
1342 } 1338 }
1343 }
1344
1345 class CountCSClosure: public HeapRegionClosure {
1346 G1CollectorPolicy* _g1_policy;
1347 public:
1348 CountCSClosure(G1CollectorPolicy* g1_policy) :
1349 _g1_policy(g1_policy) {}
1350 bool doHeapRegion(HeapRegion* r) {
1351 _g1_policy->_bytes_in_collection_set_before_gc += r->used();
1352 return false;
1353 }
1354 };
1355
1356 void G1CollectorPolicy::count_CS_bytes_used() {
1357 CountCSClosure cs_closure(this);
1358 _g1->collection_set_iterate(&cs_closure);
1359 } 1339 }
1360 1340
1361 void G1CollectorPolicy::print_tracing_info() const { 1341 void G1CollectorPolicy::print_tracing_info() const {
1362 _trace_gen0_time_data.print(); 1342 _trace_gen0_time_data.print();
1363 _trace_gen1_time_data.print(); 1343 _trace_gen1_time_data.print();
1694 // Therefore this routine may be called at a safepoint by the 1674 // Therefore this routine may be called at a safepoint by the
1695 // VM thread, or in-between safepoints by mutator threads (when 1675 // VM thread, or in-between safepoints by mutator threads (when
1696 // retiring the current allocation region) or a concurrent 1676 // retiring the current allocation region) or a concurrent
1697 // refine thread (RSet sampling). 1677 // refine thread (RSet sampling).
1698 1678
1699 double region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, true); 1679 double region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, gcs_are_young());
1700 size_t used_bytes = hr->used(); 1680 size_t used_bytes = hr->used();
1701 _inc_cset_recorded_rs_lengths += rs_length; 1681 _inc_cset_recorded_rs_lengths += rs_length;
1702 _inc_cset_predicted_elapsed_time_ms += region_elapsed_time_ms; 1682 _inc_cset_predicted_elapsed_time_ms += region_elapsed_time_ms;
1703 _inc_cset_bytes_used_before += used_bytes; 1683 _inc_cset_bytes_used_before += used_bytes;
1704 1684
1729 ssize_t old_rs_length = (ssize_t) hr->recorded_rs_length(); 1709 ssize_t old_rs_length = (ssize_t) hr->recorded_rs_length();
1730 ssize_t rs_lengths_diff = (ssize_t) new_rs_length - old_rs_length; 1710 ssize_t rs_lengths_diff = (ssize_t) new_rs_length - old_rs_length;
1731 _inc_cset_recorded_rs_lengths_diffs += rs_lengths_diff; 1711 _inc_cset_recorded_rs_lengths_diffs += rs_lengths_diff;
1732 1712
1733 double old_elapsed_time_ms = hr->predicted_elapsed_time_ms(); 1713 double old_elapsed_time_ms = hr->predicted_elapsed_time_ms();
1734 double new_region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, true); 1714 double new_region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, gcs_are_young());
1735 double elapsed_ms_diff = new_region_elapsed_time_ms - old_elapsed_time_ms; 1715 double elapsed_ms_diff = new_region_elapsed_time_ms - old_elapsed_time_ms;
1736 _inc_cset_predicted_elapsed_time_ms_diffs += elapsed_ms_diff; 1716 _inc_cset_predicted_elapsed_time_ms_diffs += elapsed_ms_diff;
1737 1717
1738 hr->set_recorded_rs_length(new_rs_length); 1718 hr->set_recorded_rs_length(new_rs_length);
1739 hr->set_predicted_elapsed_time_ms(new_region_elapsed_time_ms); 1719 hr->set_predicted_elapsed_time_ms(new_region_elapsed_time_ms);
1852 reclaimable_bytes, perc, threshold); 1832 reclaimable_bytes, perc, threshold);
1853 return true; 1833 return true;
1854 } 1834 }
1855 1835
1856 void G1CollectorPolicy::finalize_cset(double target_pause_time_ms) { 1836 void G1CollectorPolicy::finalize_cset(double target_pause_time_ms) {
1857 // Set this here - in case we're not doing young collections. 1837 double young_start_time_sec = os::elapsedTime();
1858 double non_young_start_time_sec = os::elapsedTime();
1859 1838
1860 YoungList* young_list = _g1->young_list(); 1839 YoungList* young_list = _g1->young_list();
1861 finalize_incremental_cset_building(); 1840 finalize_incremental_cset_building();
1862 1841
1863 guarantee(target_pause_time_ms > 0.0, 1842 guarantee(target_pause_time_ms > 0.0,
1867 1846
1868 double base_time_ms = predict_base_elapsed_time_ms(_pending_cards); 1847 double base_time_ms = predict_base_elapsed_time_ms(_pending_cards);
1869 double predicted_pause_time_ms = base_time_ms; 1848 double predicted_pause_time_ms = base_time_ms;
1870 double time_remaining_ms = target_pause_time_ms - base_time_ms; 1849 double time_remaining_ms = target_pause_time_ms - base_time_ms;
1871 1850
1872 ergo_verbose3(ErgoCSetConstruction | ErgoHigh, 1851 ergo_verbose4(ErgoCSetConstruction | ErgoHigh,
1873 "start choosing CSet", 1852 "start choosing CSet",
1853 ergo_format_size("_pending_cards")
1874 ergo_format_ms("predicted base time") 1854 ergo_format_ms("predicted base time")
1875 ergo_format_ms("remaining time") 1855 ergo_format_ms("remaining time")
1876 ergo_format_ms("target pause time"), 1856 ergo_format_ms("target pause time"),
1877 base_time_ms, time_remaining_ms, target_pause_time_ms); 1857 _pending_cards, base_time_ms, time_remaining_ms, target_pause_time_ms);
1878 1858
1879 HeapRegion* hr;
1880 double young_start_time_sec = os::elapsedTime();
1881
1882 _collection_set_bytes_used_before = 0;
1883 _last_gc_was_young = gcs_are_young() ? true : false; 1859 _last_gc_was_young = gcs_are_young() ? true : false;
1884 1860
1885 if (_last_gc_was_young) { 1861 if (_last_gc_was_young) {
1886 _trace_gen0_time_data.increment_young_collection_count(); 1862 _trace_gen0_time_data.increment_young_collection_count();
1887 } else { 1863 } else {
1893 // [Newly Young Regions ++ Survivors from last pause]. 1869 // [Newly Young Regions ++ Survivors from last pause].
1894 1870
1895 uint survivor_region_length = young_list->survivor_length(); 1871 uint survivor_region_length = young_list->survivor_length();
1896 uint eden_region_length = young_list->length() - survivor_region_length; 1872 uint eden_region_length = young_list->length() - survivor_region_length;
1897 init_cset_region_lengths(eden_region_length, survivor_region_length); 1873 init_cset_region_lengths(eden_region_length, survivor_region_length);
1898 hr = young_list->first_survivor_region(); 1874
1875 HeapRegion* hr = young_list->first_survivor_region();
1899 while (hr != NULL) { 1876 while (hr != NULL) {
1900 assert(hr->is_survivor(), "badly formed young list"); 1877 assert(hr->is_survivor(), "badly formed young list");
1901 hr->set_young(); 1878 hr->set_young();
1902 hr = hr->get_next_young_region(); 1879 hr = hr->get_next_young_region();
1903 } 1880 }
1924 1901
1925 double young_end_time_sec = os::elapsedTime(); 1902 double young_end_time_sec = os::elapsedTime();
1926 phase_times()->_recorded_young_cset_choice_time_ms = 1903 phase_times()->_recorded_young_cset_choice_time_ms =
1927 (young_end_time_sec - young_start_time_sec) * 1000.0; 1904 (young_end_time_sec - young_start_time_sec) * 1000.0;
1928 1905
1929 // We are doing young collections so reset this. 1906 // Set the start of the non-young choice time.
1930 non_young_start_time_sec = young_end_time_sec; 1907 double non_young_start_time_sec = young_end_time_sec;
1931 1908
1932 if (!gcs_are_young()) { 1909 if (!gcs_are_young()) {
1933 CollectionSetChooser* cset_chooser = _collectionSetChooser; 1910 CollectionSetChooser* cset_chooser = _collectionSetChooser;
1934 cset_chooser->verify(); 1911 cset_chooser->verify();
1935 const uint min_old_cset_length = cset_chooser->calc_min_old_cset_length(); 1912 const uint min_old_cset_length = cset_chooser->calc_min_old_cset_length();
1936 const uint max_old_cset_length = cset_chooser->calc_max_old_cset_length(); 1913 const uint max_old_cset_length = cset_chooser->calc_max_old_cset_length();
1937 1914
1938 uint expensive_region_num = 0; 1915 uint expensive_region_num = 0;
1939 bool check_time_remaining = adaptive_young_list_length(); 1916 bool check_time_remaining = adaptive_young_list_length();
1917
1940 HeapRegion* hr = cset_chooser->peek(); 1918 HeapRegion* hr = cset_chooser->peek();
1941 while (hr != NULL) { 1919 while (hr != NULL) {
1942 if (old_cset_region_length() >= max_old_cset_length) { 1920 if (old_cset_region_length() >= max_old_cset_length) {
1943 // Added maximum number of old regions to the CSet. 1921 // Added maximum number of old regions to the CSet.
1944 ergo_verbose2(ErgoCSetConstruction, 1922 ergo_verbose2(ErgoCSetConstruction,
1948 ergo_format_region("max"), 1926 ergo_format_region("max"),
1949 old_cset_region_length(), max_old_cset_length); 1927 old_cset_region_length(), max_old_cset_length);
1950 break; 1928 break;
1951 } 1929 }
1952 1930
1953 double predicted_time_ms = predict_region_elapsed_time_ms(hr, false); 1931 double predicted_time_ms = predict_region_elapsed_time_ms(hr, gcs_are_young());
1954 if (check_time_remaining) { 1932 if (check_time_remaining) {
1955 if (predicted_time_ms > time_remaining_ms) { 1933 if (predicted_time_ms > time_remaining_ms) {
1956 // Too expensive for the current CSet. 1934 // Too expensive for the current CSet.
1957 1935
1958 if (old_cset_region_length() >= min_old_cset_length) { 1936 if (old_cset_region_length() >= min_old_cset_length) {
2023 cset_chooser->verify(); 2001 cset_chooser->verify();
2024 } 2002 }
2025 2003
2026 stop_incremental_cset_building(); 2004 stop_incremental_cset_building();
2027 2005
2028 count_CS_bytes_used();
2029
2030 ergo_verbose5(ErgoCSetConstruction, 2006 ergo_verbose5(ErgoCSetConstruction,
2031 "finish choosing CSet", 2007 "finish choosing CSet",
2032 ergo_format_region("eden") 2008 ergo_format_region("eden")
2033 ergo_format_region("survivors") 2009 ergo_format_region("survivors")
2034 ergo_format_region("old") 2010 ergo_format_region("old")

mercurial