57 _survivor_region_length(0), |
57 _survivor_region_length(0), |
58 _old_region_length(0), |
58 _old_region_length(0), |
59 |
59 |
60 _head(NULL), |
60 _head(NULL), |
61 _bytes_used_before(0), |
61 _bytes_used_before(0), |
|
62 _bytes_live_before(0), |
62 _recorded_rs_lengths(0), |
63 _recorded_rs_lengths(0), |
63 // Incremental CSet attributes |
64 // Incremental CSet attributes |
64 _inc_build_state(Inactive), |
65 _inc_build_state(Inactive), |
65 _inc_head(NULL), |
66 _inc_head(NULL), |
66 _inc_tail(NULL), |
67 _inc_tail(NULL), |
67 _inc_bytes_used_before(0), |
68 _inc_bytes_used_before(0), |
|
69 _inc_bytes_live_before(0), |
68 _inc_recorded_rs_lengths(0), |
70 _inc_recorded_rs_lengths(0), |
69 _inc_recorded_rs_lengths_diffs(0), |
71 _inc_recorded_rs_lengths_diffs(0), |
70 _inc_predicted_elapsed_time_ms(0.0), |
72 _inc_predicted_elapsed_time_ms(0.0), |
71 _inc_predicted_elapsed_time_ms_diffs(0.0) {} |
73 _inc_predicted_elapsed_time_ms_diffs(0.0) {} |
72 |
74 |
93 assert(!hr->in_collection_set(), "should not already be in the CSet"); |
95 assert(!hr->in_collection_set(), "should not already be in the CSet"); |
94 _g1->register_old_region_with_cset(hr); |
96 _g1->register_old_region_with_cset(hr); |
95 hr->set_next_in_collection_set(_head); |
97 hr->set_next_in_collection_set(_head); |
96 _head = hr; |
98 _head = hr; |
97 _bytes_used_before += hr->used(); |
99 _bytes_used_before += hr->used(); |
|
100 _bytes_live_before += hr->live_bytes(); |
98 size_t rs_length = hr->rem_set()->occupied(); |
101 size_t rs_length = hr->rem_set()->occupied(); |
99 _recorded_rs_lengths += rs_length; |
102 _recorded_rs_lengths += rs_length; |
100 _old_region_length += 1; |
103 _old_region_length += 1; |
101 } |
104 } |
102 |
105 |
105 assert(_inc_build_state == Inactive, "Precondition"); |
108 assert(_inc_build_state == Inactive, "Precondition"); |
106 |
109 |
107 _inc_head = NULL; |
110 _inc_head = NULL; |
108 _inc_tail = NULL; |
111 _inc_tail = NULL; |
109 _inc_bytes_used_before = 0; |
112 _inc_bytes_used_before = 0; |
|
113 _inc_bytes_live_before = 0; |
110 |
114 |
111 _inc_recorded_rs_lengths = 0; |
115 _inc_recorded_rs_lengths = 0; |
112 _inc_recorded_rs_lengths_diffs = 0; |
116 _inc_recorded_rs_lengths_diffs = 0; |
113 _inc_predicted_elapsed_time_ms = 0.0; |
117 _inc_predicted_elapsed_time_ms = 0.0; |
114 _inc_predicted_elapsed_time_ms_diffs = 0.0; |
118 _inc_predicted_elapsed_time_ms_diffs = 0.0; |
207 |
211 |
208 size_t used_bytes = hr->used(); |
212 size_t used_bytes = hr->used(); |
209 _inc_recorded_rs_lengths += rs_length; |
213 _inc_recorded_rs_lengths += rs_length; |
210 _inc_predicted_elapsed_time_ms += region_elapsed_time_ms; |
214 _inc_predicted_elapsed_time_ms += region_elapsed_time_ms; |
211 _inc_bytes_used_before += used_bytes; |
215 _inc_bytes_used_before += used_bytes; |
|
216 _inc_bytes_live_before += hr->live_bytes(); |
212 |
217 |
213 assert(!hr->in_collection_set(), "invariant"); |
218 assert(!hr->in_collection_set(), "invariant"); |
214 _g1->register_young_region_with_cset(hr); |
219 _g1->register_young_region_with_cset(hr); |
215 assert(hr->next_in_collection_set() == NULL, "invariant"); |
220 assert(hr->next_in_collection_set() == NULL, "invariant"); |
216 } |
221 } |
309 // Clear the fields that point to the survivor list - they are all young now. |
314 // Clear the fields that point to the survivor list - they are all young now. |
310 young_list->clear_survivors(); |
315 young_list->clear_survivors(); |
311 |
316 |
312 _head = _inc_head; |
317 _head = _inc_head; |
313 _bytes_used_before = _inc_bytes_used_before; |
318 _bytes_used_before = _inc_bytes_used_before; |
|
319 _bytes_live_before = _inc_bytes_live_before; |
314 time_remaining_ms = MAX2(time_remaining_ms - _inc_predicted_elapsed_time_ms, 0.0); |
320 time_remaining_ms = MAX2(time_remaining_ms - _inc_predicted_elapsed_time_ms, 0.0); |
315 |
321 |
316 log_trace(gc, ergo, cset)("Add young regions to CSet. eden: %u regions, survivors: %u regions, predicted young region time: %1.2fms, target pause time: %1.2fms", |
322 log_trace(gc, ergo, cset)("Add young regions to CSet. eden: %u regions, survivors: %u regions, predicted young region time: %1.2fms, target pause time: %1.2fms", |
317 eden_region_length, survivor_region_length, _inc_predicted_elapsed_time_ms, target_pause_time_ms); |
323 eden_region_length, survivor_region_length, _inc_predicted_elapsed_time_ms, target_pause_time_ms); |
318 |
324 |
332 |
338 |
333 if (!collector_state()->gcs_are_young()) { |
339 if (!collector_state()->gcs_are_young()) { |
334 cset_chooser()->verify(); |
340 cset_chooser()->verify(); |
335 const uint min_old_cset_length = _policy->calc_min_old_cset_length(); |
341 const uint min_old_cset_length = _policy->calc_min_old_cset_length(); |
336 const uint max_old_cset_length = _policy->calc_max_old_cset_length(); |
342 const uint max_old_cset_length = _policy->calc_max_old_cset_length(); |
|
343 const size_t estimated_available_bytes = _policy->available_bytes_estimate(); |
337 |
344 |
338 uint expensive_region_num = 0; |
345 uint expensive_region_num = 0; |
339 bool check_time_remaining = _policy->adaptive_young_list_length(); |
346 bool check_time_remaining = _policy->adaptive_young_list_length(); |
340 |
347 |
341 HeapRegion* hr = cset_chooser()->peek(); |
348 HeapRegion* hr = cset_chooser()->peek(); |
360 "old %u regions, max %u regions, reclaimable: " SIZE_FORMAT "B (%1.2f%%) threshold: " UINTX_FORMAT "%%", |
367 "old %u regions, max %u regions, reclaimable: " SIZE_FORMAT "B (%1.2f%%) threshold: " UINTX_FORMAT "%%", |
361 old_region_length(), max_old_cset_length, reclaimable_bytes, reclaimable_perc, G1HeapWastePercent); |
368 old_region_length(), max_old_cset_length, reclaimable_bytes, reclaimable_perc, G1HeapWastePercent); |
362 break; |
369 break; |
363 } |
370 } |
364 |
371 |
|
372 // Stop adding regions if the live bytes (according to the last marking) |
|
373 // added so far would exceed the estimated free bytes. |
|
374 if ((_bytes_live_before + hr->live_bytes()) > estimated_available_bytes) { |
|
375 log_debug(gc, ergo, cset)("Finish adding old regions to CSet (reached estimated free space limit)"); |
|
376 break; |
|
377 } |
|
378 |
365 double predicted_time_ms = predict_region_elapsed_time_ms(hr); |
379 double predicted_time_ms = predict_region_elapsed_time_ms(hr); |
366 if (check_time_remaining) { |
380 if (check_time_remaining) { |
367 if (predicted_time_ms > time_remaining_ms) { |
381 if (predicted_time_ms > time_remaining_ms) { |
368 // Too expensive for the current CSet. |
382 // Too expensive for the current CSet. |
369 |
383 |