Thu, 17 Nov 2011 12:40:15 -0800
7112743: G1: Reduce overhead of marking closure during evacuation pauses
Summary: Parallelize the serial code that was used to mark objects reachable from survivor objects in the collection set. Some minor improvments in the timers used to track the freeing of the collection set along with some tweaks to PrintGCDetails.
Reviewed-by: tonyp, brutisso
1 /*
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #include "precompiled.hpp"
26 #include "gc_implementation/g1/concurrentG1Refine.hpp"
27 #include "gc_implementation/g1/concurrentMark.hpp"
28 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
30 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
31 #include "gc_implementation/g1/g1ErgoVerbose.hpp"
32 #include "gc_implementation/g1/heapRegionRemSet.hpp"
33 #include "gc_implementation/shared/gcPolicyCounters.hpp"
34 #include "runtime/arguments.hpp"
35 #include "runtime/java.hpp"
36 #include "runtime/mutexLocker.hpp"
37 #include "utilities/debug.hpp"
39 // Different defaults for different number of GC threads
40 // They were chosen by running GCOld and SPECjbb on debris with different
41 // numbers of GC threads and choosing them based on the results
43 // all the same
44 static double rs_length_diff_defaults[] = {
45 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
46 };
48 static double cost_per_card_ms_defaults[] = {
49 0.01, 0.005, 0.005, 0.003, 0.003, 0.002, 0.002, 0.0015
50 };
52 // all the same
53 static double fully_young_cards_per_entry_ratio_defaults[] = {
54 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
55 };
57 static double cost_per_entry_ms_defaults[] = {
58 0.015, 0.01, 0.01, 0.008, 0.008, 0.0055, 0.0055, 0.005
59 };
61 static double cost_per_byte_ms_defaults[] = {
62 0.00006, 0.00003, 0.00003, 0.000015, 0.000015, 0.00001, 0.00001, 0.000009
63 };
65 // these should be pretty consistent
66 static double constant_other_time_ms_defaults[] = {
67 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0
68 };
71 static double young_other_cost_per_region_ms_defaults[] = {
72 0.3, 0.2, 0.2, 0.15, 0.15, 0.12, 0.12, 0.1
73 };
75 static double non_young_other_cost_per_region_ms_defaults[] = {
76 1.0, 0.7, 0.7, 0.5, 0.5, 0.42, 0.42, 0.30
77 };
79 // Help class for avoiding interleaved logging
80 class LineBuffer: public StackObj {
82 private:
83 static const int BUFFER_LEN = 1024;
84 static const int INDENT_CHARS = 3;
85 char _buffer[BUFFER_LEN];
86 int _indent_level;
87 int _cur;
89 void vappend(const char* format, va_list ap) {
90 int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap);
91 if (res != -1) {
92 _cur += res;
93 } else {
94 DEBUG_ONLY(warning("buffer too small in LineBuffer");)
95 _buffer[BUFFER_LEN -1] = 0;
96 _cur = BUFFER_LEN; // vsnprintf above should not add to _buffer if we are called again
97 }
98 }
100 public:
101 explicit LineBuffer(int indent_level): _indent_level(indent_level), _cur(0) {
102 for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) {
103 _buffer[_cur] = ' ';
104 }
105 }
107 #ifndef PRODUCT
108 ~LineBuffer() {
109 assert(_cur == _indent_level * INDENT_CHARS, "pending data in buffer - append_and_print_cr() not called?");
110 }
111 #endif
113 void append(const char* format, ...) {
114 va_list ap;
115 va_start(ap, format);
116 vappend(format, ap);
117 va_end(ap);
118 }
120 void append_and_print_cr(const char* format, ...) {
121 va_list ap;
122 va_start(ap, format);
123 vappend(format, ap);
124 va_end(ap);
125 gclog_or_tty->print_cr("%s", _buffer);
126 _cur = _indent_level * INDENT_CHARS;
127 }
128 };
130 G1CollectorPolicy::G1CollectorPolicy() :
131 _parallel_gc_threads(G1CollectedHeap::use_parallel_gc_threads()
132 ? ParallelGCThreads : 1),
134 _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
135 _all_pause_times_ms(new NumberSeq()),
136 _stop_world_start(0.0),
137 _all_stop_world_times_ms(new NumberSeq()),
138 _all_yield_times_ms(new NumberSeq()),
139 _using_new_ratio_calculations(false),
141 _summary(new Summary()),
143 _cur_clear_ct_time_ms(0.0),
144 _mark_closure_time_ms(0.0),
146 _cur_ref_proc_time_ms(0.0),
147 _cur_ref_enq_time_ms(0.0),
149 #ifndef PRODUCT
150 _min_clear_cc_time_ms(-1.0),
151 _max_clear_cc_time_ms(-1.0),
152 _cur_clear_cc_time_ms(0.0),
153 _cum_clear_cc_time_ms(0.0),
154 _num_cc_clears(0L),
155 #endif
157 _aux_num(10),
158 _all_aux_times_ms(new NumberSeq[_aux_num]),
159 _cur_aux_start_times_ms(new double[_aux_num]),
160 _cur_aux_times_ms(new double[_aux_num]),
161 _cur_aux_times_set(new bool[_aux_num]),
163 _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
164 _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
166 _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
167 _prev_collection_pause_end_ms(0.0),
168 _pending_card_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
169 _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
170 _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
171 _fully_young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
172 _partially_young_cards_per_entry_ratio_seq(
173 new TruncatedSeq(TruncatedSeqLength)),
174 _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
175 _partially_young_cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
176 _cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
177 _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
178 _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
179 _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
180 _non_young_other_cost_per_region_ms_seq(
181 new TruncatedSeq(TruncatedSeqLength)),
183 _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
184 _rs_lengths_seq(new TruncatedSeq(TruncatedSeqLength)),
186 _pause_time_target_ms((double) MaxGCPauseMillis),
188 _full_young_gcs(true),
189 _full_young_pause_num(0),
190 _partial_young_pause_num(0),
192 _during_marking(false),
193 _in_marking_window(false),
194 _in_marking_window_im(false),
196 _known_garbage_ratio(0.0),
197 _known_garbage_bytes(0),
199 _young_gc_eff_seq(new TruncatedSeq(TruncatedSeqLength)),
201 _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),
203 _recent_avg_pause_time_ratio(0.0),
205 _all_full_gc_times_ms(new NumberSeq()),
207 _initiate_conc_mark_if_possible(false),
208 _during_initial_mark_pause(false),
209 _should_revert_to_full_young_gcs(false),
210 _last_full_young_gc(false),
212 _eden_bytes_before_gc(0),
213 _survivor_bytes_before_gc(0),
214 _capacity_before_gc(0),
216 _prev_collection_pause_used_at_end_bytes(0),
218 _eden_cset_region_length(0),
219 _survivor_cset_region_length(0),
220 _old_cset_region_length(0),
222 _collection_set(NULL),
223 _collection_set_bytes_used_before(0),
225 // Incremental CSet attributes
226 _inc_cset_build_state(Inactive),
227 _inc_cset_head(NULL),
228 _inc_cset_tail(NULL),
229 _inc_cset_bytes_used_before(0),
230 _inc_cset_max_finger(NULL),
231 _inc_cset_recorded_rs_lengths(0),
232 _inc_cset_predicted_elapsed_time_ms(0.0),
234 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
235 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
236 #endif // _MSC_VER
238 _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived",
239 G1YoungSurvRateNumRegionsSummary)),
240 _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor",
241 G1YoungSurvRateNumRegionsSummary)),
242 // add here any more surv rate groups
243 _recorded_survivor_regions(0),
244 _recorded_survivor_head(NULL),
245 _recorded_survivor_tail(NULL),
246 _survivors_age_table(true),
248 _gc_overhead_perc(0.0) {
250 // Set up the region size and associated fields. Given that the
251 // policy is created before the heap, we have to set this up here,
252 // so it's done as soon as possible.
253 HeapRegion::setup_heap_region_size(Arguments::min_heap_size());
254 HeapRegionRemSet::setup_remset_size();
256 G1ErgoVerbose::initialize();
257 if (PrintAdaptiveSizePolicy) {
258 // Currently, we only use a single switch for all the heuristics.
259 G1ErgoVerbose::set_enabled(true);
260 // Given that we don't currently have a verboseness level
261 // parameter, we'll hardcode this to high. This can be easily
262 // changed in the future.
263 G1ErgoVerbose::set_level(ErgoHigh);
264 } else {
265 G1ErgoVerbose::set_enabled(false);
266 }
268 // Verify PLAB sizes
269 const size_t region_size = HeapRegion::GrainWords;
270 if (YoungPLABSize > region_size || OldPLABSize > region_size) {
271 char buffer[128];
272 jio_snprintf(buffer, sizeof(buffer), "%sPLABSize should be at most "SIZE_FORMAT,
273 OldPLABSize > region_size ? "Old" : "Young", region_size);
274 vm_exit_during_initialization(buffer);
275 }
277 _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
278 _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
280 _par_last_gc_worker_start_times_ms = new double[_parallel_gc_threads];
281 _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads];
282 _par_last_mark_stack_scan_times_ms = new double[_parallel_gc_threads];
284 _par_last_update_rs_times_ms = new double[_parallel_gc_threads];
285 _par_last_update_rs_processed_buffers = new double[_parallel_gc_threads];
287 _par_last_scan_rs_times_ms = new double[_parallel_gc_threads];
289 _par_last_obj_copy_times_ms = new double[_parallel_gc_threads];
291 _par_last_termination_times_ms = new double[_parallel_gc_threads];
292 _par_last_termination_attempts = new double[_parallel_gc_threads];
293 _par_last_gc_worker_end_times_ms = new double[_parallel_gc_threads];
294 _par_last_gc_worker_times_ms = new double[_parallel_gc_threads];
295 _par_last_gc_worker_other_times_ms = new double[_parallel_gc_threads];
297 // start conservatively
298 _expensive_region_limit_ms = 0.5 * (double) MaxGCPauseMillis;
300 int index;
301 if (ParallelGCThreads == 0)
302 index = 0;
303 else if (ParallelGCThreads > 8)
304 index = 7;
305 else
306 index = ParallelGCThreads - 1;
308 _pending_card_diff_seq->add(0.0);
309 _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
310 _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]);
311 _fully_young_cards_per_entry_ratio_seq->add(
312 fully_young_cards_per_entry_ratio_defaults[index]);
313 _cost_per_entry_ms_seq->add(cost_per_entry_ms_defaults[index]);
314 _cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
315 _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
316 _young_other_cost_per_region_ms_seq->add(
317 young_other_cost_per_region_ms_defaults[index]);
318 _non_young_other_cost_per_region_ms_seq->add(
319 non_young_other_cost_per_region_ms_defaults[index]);
321 // Below, we might need to calculate the pause time target based on
322 // the pause interval. When we do so we are going to give G1 maximum
323 // flexibility and allow it to do pauses when it needs to. So, we'll
324 // arrange that the pause interval to be pause time target + 1 to
325 // ensure that a) the pause time target is maximized with respect to
326 // the pause interval and b) we maintain the invariant that pause
327 // time target < pause interval. If the user does not want this
328 // maximum flexibility, they will have to set the pause interval
329 // explicitly.
331 // First make sure that, if either parameter is set, its value is
332 // reasonable.
333 if (!FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
334 if (MaxGCPauseMillis < 1) {
335 vm_exit_during_initialization("MaxGCPauseMillis should be "
336 "greater than 0");
337 }
338 }
339 if (!FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
340 if (GCPauseIntervalMillis < 1) {
341 vm_exit_during_initialization("GCPauseIntervalMillis should be "
342 "greater than 0");
343 }
344 }
346 // Then, if the pause time target parameter was not set, set it to
347 // the default value.
348 if (FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
349 if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
350 // The default pause time target in G1 is 200ms
351 FLAG_SET_DEFAULT(MaxGCPauseMillis, 200);
352 } else {
353 // We do not allow the pause interval to be set without the
354 // pause time target
355 vm_exit_during_initialization("GCPauseIntervalMillis cannot be set "
356 "without setting MaxGCPauseMillis");
357 }
358 }
360 // Then, if the interval parameter was not set, set it according to
361 // the pause time target (this will also deal with the case when the
362 // pause time target is the default value).
363 if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
364 FLAG_SET_DEFAULT(GCPauseIntervalMillis, MaxGCPauseMillis + 1);
365 }
367 // Finally, make sure that the two parameters are consistent.
368 if (MaxGCPauseMillis >= GCPauseIntervalMillis) {
369 char buffer[256];
370 jio_snprintf(buffer, 256,
371 "MaxGCPauseMillis (%u) should be less than "
372 "GCPauseIntervalMillis (%u)",
373 MaxGCPauseMillis, GCPauseIntervalMillis);
374 vm_exit_during_initialization(buffer);
375 }
377 double max_gc_time = (double) MaxGCPauseMillis / 1000.0;
378 double time_slice = (double) GCPauseIntervalMillis / 1000.0;
379 _mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
380 _sigma = (double) G1ConfidencePercent / 100.0;
382 // start conservatively (around 50ms is about right)
383 _concurrent_mark_remark_times_ms->add(0.05);
384 _concurrent_mark_cleanup_times_ms->add(0.20);
385 _tenuring_threshold = MaxTenuringThreshold;
386 // _max_survivor_regions will be calculated by
387 // update_young_list_target_length() during initialization.
388 _max_survivor_regions = 0;
390 assert(GCTimeRatio > 0,
391 "we should have set it to a default value set_g1_gc_flags() "
392 "if a user set it to 0");
393 _gc_overhead_perc = 100.0 * (1.0 / (1.0 + GCTimeRatio));
395 uintx reserve_perc = G1ReservePercent;
396 // Put an artificial ceiling on this so that it's not set to a silly value.
397 if (reserve_perc > 50) {
398 reserve_perc = 50;
399 warning("G1ReservePercent is set to a value that is too large, "
400 "it's been updated to %u", reserve_perc);
401 }
402 _reserve_factor = (double) reserve_perc / 100.0;
403 // This will be set when the heap is expanded
404 // for the first time during initialization.
405 _reserve_regions = 0;
407 initialize_all();
408 _collectionSetChooser = new CollectionSetChooser();
409 }
411 // Increment "i", mod "len"
412 static void inc_mod(int& i, int len) {
413 i++; if (i == len) i = 0;
414 }
416 void G1CollectorPolicy::initialize_flags() {
417 set_min_alignment(HeapRegion::GrainBytes);
418 set_max_alignment(GenRemSet::max_alignment_constraint(rem_set_name()));
419 if (SurvivorRatio < 1) {
420 vm_exit_during_initialization("Invalid survivor ratio specified");
421 }
422 CollectorPolicy::initialize_flags();
423 }
425 // The easiest way to deal with the parsing of the NewSize /
426 // MaxNewSize / etc. parameteres is to re-use the code in the
427 // TwoGenerationCollectorPolicy class. This is similar to what
428 // ParallelScavenge does with its GenerationSizer class (see
429 // ParallelScavengeHeap::initialize()). We might change this in the
430 // future, but it's a good start.
431 class G1YoungGenSizer : public TwoGenerationCollectorPolicy {
432 private:
433 size_t size_to_region_num(size_t byte_size) {
434 return MAX2((size_t) 1, byte_size / HeapRegion::GrainBytes);
435 }
437 public:
438 G1YoungGenSizer() {
439 initialize_flags();
440 initialize_size_info();
441 }
442 size_t min_young_region_num() {
443 return size_to_region_num(_min_gen0_size);
444 }
445 size_t initial_young_region_num() {
446 return size_to_region_num(_initial_gen0_size);
447 }
448 size_t max_young_region_num() {
449 return size_to_region_num(_max_gen0_size);
450 }
451 };
453 void G1CollectorPolicy::update_young_list_size_using_newratio(size_t number_of_heap_regions) {
454 assert(number_of_heap_regions > 0, "Heap must be initialized");
455 size_t young_size = number_of_heap_regions / (NewRatio + 1);
456 _min_desired_young_length = young_size;
457 _max_desired_young_length = young_size;
458 }
460 void G1CollectorPolicy::init() {
461 // Set aside an initial future to_space.
462 _g1 = G1CollectedHeap::heap();
464 assert(Heap_lock->owned_by_self(), "Locking discipline.");
466 initialize_gc_policy_counters();
468 G1YoungGenSizer sizer;
469 _min_desired_young_length = sizer.min_young_region_num();
470 _max_desired_young_length = sizer.max_young_region_num();
472 if (FLAG_IS_CMDLINE(NewRatio)) {
473 if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
474 warning("-XX:NewSize and -XX:MaxNewSize override -XX:NewRatio");
475 } else {
476 // Treat NewRatio as a fixed size that is only recalculated when the heap size changes
477 update_young_list_size_using_newratio(_g1->n_regions());
478 _using_new_ratio_calculations = true;
479 }
480 }
482 assert(_min_desired_young_length <= _max_desired_young_length, "Invalid min/max young gen size values");
484 set_adaptive_young_list_length(_min_desired_young_length < _max_desired_young_length);
485 if (adaptive_young_list_length()) {
486 _young_list_fixed_length = 0;
487 } else {
488 assert(_min_desired_young_length == _max_desired_young_length, "Min and max young size differ");
489 _young_list_fixed_length = _min_desired_young_length;
490 }
491 _free_regions_at_end_of_collection = _g1->free_regions();
492 update_young_list_target_length();
493 _prev_eden_capacity = _young_list_target_length * HeapRegion::GrainBytes;
495 // We may immediately start allocating regions and placing them on the
496 // collection set list. Initialize the per-collection set info
497 start_incremental_cset_building();
498 }
500 // Create the jstat counters for the policy.
501 void G1CollectorPolicy::initialize_gc_policy_counters() {
502 _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 3);
503 }
505 bool G1CollectorPolicy::predict_will_fit(size_t young_length,
506 double base_time_ms,
507 size_t base_free_regions,
508 double target_pause_time_ms) {
509 if (young_length >= base_free_regions) {
510 // end condition 1: not enough space for the young regions
511 return false;
512 }
514 double accum_surv_rate = accum_yg_surv_rate_pred((int)(young_length - 1));
515 size_t bytes_to_copy =
516 (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes);
517 double copy_time_ms = predict_object_copy_time_ms(bytes_to_copy);
518 double young_other_time_ms = predict_young_other_time_ms(young_length);
519 double pause_time_ms = base_time_ms + copy_time_ms + young_other_time_ms;
520 if (pause_time_ms > target_pause_time_ms) {
521 // end condition 2: prediction is over the target pause time
522 return false;
523 }
525 size_t free_bytes =
526 (base_free_regions - young_length) * HeapRegion::GrainBytes;
527 if ((2.0 * sigma()) * (double) bytes_to_copy > (double) free_bytes) {
528 // end condition 3: out-of-space (conservatively!)
529 return false;
530 }
532 // success!
533 return true;
534 }
536 void G1CollectorPolicy::record_new_heap_size(size_t new_number_of_regions) {
537 // re-calculate the necessary reserve
538 double reserve_regions_d = (double) new_number_of_regions * _reserve_factor;
539 // We use ceiling so that if reserve_regions_d is > 0.0 (but
540 // smaller than 1.0) we'll get 1.
541 _reserve_regions = (size_t) ceil(reserve_regions_d);
543 if (_using_new_ratio_calculations) {
544 // -XX:NewRatio was specified so we need to update the
545 // young gen length when the heap size has changed.
546 update_young_list_size_using_newratio(new_number_of_regions);
547 }
548 }
550 size_t G1CollectorPolicy::calculate_young_list_desired_min_length(
551 size_t base_min_length) {
552 size_t desired_min_length = 0;
553 if (adaptive_young_list_length()) {
554 if (_alloc_rate_ms_seq->num() > 3) {
555 double now_sec = os::elapsedTime();
556 double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0;
557 double alloc_rate_ms = predict_alloc_rate_ms();
558 desired_min_length = (size_t) ceil(alloc_rate_ms * when_ms);
559 } else {
560 // otherwise we don't have enough info to make the prediction
561 }
562 }
563 desired_min_length += base_min_length;
564 // make sure we don't go below any user-defined minimum bound
565 return MAX2(_min_desired_young_length, desired_min_length);
566 }
568 size_t G1CollectorPolicy::calculate_young_list_desired_max_length() {
569 // Here, we might want to also take into account any additional
570 // constraints (i.e., user-defined minimum bound). Currently, we
571 // effectively don't set this bound.
572 return _max_desired_young_length;
573 }
575 void G1CollectorPolicy::update_young_list_target_length(size_t rs_lengths) {
576 if (rs_lengths == (size_t) -1) {
577 // if it's set to the default value (-1), we should predict it;
578 // otherwise, use the given value.
579 rs_lengths = (size_t) get_new_prediction(_rs_lengths_seq);
580 }
582 // Calculate the absolute and desired min bounds.
584 // This is how many young regions we already have (currently: the survivors).
585 size_t base_min_length = recorded_survivor_regions();
586 // This is the absolute minimum young length, which ensures that we
587 // can allocate one eden region in the worst-case.
588 size_t absolute_min_length = base_min_length + 1;
589 size_t desired_min_length =
590 calculate_young_list_desired_min_length(base_min_length);
591 if (desired_min_length < absolute_min_length) {
592 desired_min_length = absolute_min_length;
593 }
595 // Calculate the absolute and desired max bounds.
597 // We will try our best not to "eat" into the reserve.
598 size_t absolute_max_length = 0;
599 if (_free_regions_at_end_of_collection > _reserve_regions) {
600 absolute_max_length = _free_regions_at_end_of_collection - _reserve_regions;
601 }
602 size_t desired_max_length = calculate_young_list_desired_max_length();
603 if (desired_max_length > absolute_max_length) {
604 desired_max_length = absolute_max_length;
605 }
607 size_t young_list_target_length = 0;
608 if (adaptive_young_list_length()) {
609 if (full_young_gcs()) {
610 young_list_target_length =
611 calculate_young_list_target_length(rs_lengths,
612 base_min_length,
613 desired_min_length,
614 desired_max_length);
615 _rs_lengths_prediction = rs_lengths;
616 } else {
617 // Don't calculate anything and let the code below bound it to
618 // the desired_min_length, i.e., do the next GC as soon as
619 // possible to maximize how many old regions we can add to it.
620 }
621 } else {
622 if (full_young_gcs()) {
623 young_list_target_length = _young_list_fixed_length;
624 } else {
625 // A bit arbitrary: during partially-young GCs we allocate half
626 // the young regions to try to add old regions to the CSet.
627 young_list_target_length = _young_list_fixed_length / 2;
628 // We choose to accept that we might go under the desired min
629 // length given that we intentionally ask for a smaller young gen.
630 desired_min_length = absolute_min_length;
631 }
632 }
634 // Make sure we don't go over the desired max length, nor under the
635 // desired min length. In case they clash, desired_min_length wins
636 // which is why that test is second.
637 if (young_list_target_length > desired_max_length) {
638 young_list_target_length = desired_max_length;
639 }
640 if (young_list_target_length < desired_min_length) {
641 young_list_target_length = desired_min_length;
642 }
644 assert(young_list_target_length > recorded_survivor_regions(),
645 "we should be able to allocate at least one eden region");
646 assert(young_list_target_length >= absolute_min_length, "post-condition");
647 _young_list_target_length = young_list_target_length;
649 update_max_gc_locker_expansion();
650 }
652 size_t
653 G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths,
654 size_t base_min_length,
655 size_t desired_min_length,
656 size_t desired_max_length) {
657 assert(adaptive_young_list_length(), "pre-condition");
658 assert(full_young_gcs(), "only call this for fully-young GCs");
660 // In case some edge-condition makes the desired max length too small...
661 if (desired_max_length <= desired_min_length) {
662 return desired_min_length;
663 }
665 // We'll adjust min_young_length and max_young_length not to include
666 // the already allocated young regions (i.e., so they reflect the
667 // min and max eden regions we'll allocate). The base_min_length
668 // will be reflected in the predictions by the
669 // survivor_regions_evac_time prediction.
670 assert(desired_min_length > base_min_length, "invariant");
671 size_t min_young_length = desired_min_length - base_min_length;
672 assert(desired_max_length > base_min_length, "invariant");
673 size_t max_young_length = desired_max_length - base_min_length;
675 double target_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0;
676 double survivor_regions_evac_time = predict_survivor_regions_evac_time();
677 size_t pending_cards = (size_t) get_new_prediction(_pending_cards_seq);
678 size_t adj_rs_lengths = rs_lengths + predict_rs_length_diff();
679 size_t scanned_cards = predict_young_card_num(adj_rs_lengths);
680 double base_time_ms =
681 predict_base_elapsed_time_ms(pending_cards, scanned_cards) +
682 survivor_regions_evac_time;
683 size_t available_free_regions = _free_regions_at_end_of_collection;
684 size_t base_free_regions = 0;
685 if (available_free_regions > _reserve_regions) {
686 base_free_regions = available_free_regions - _reserve_regions;
687 }
689 // Here, we will make sure that the shortest young length that
690 // makes sense fits within the target pause time.
692 if (predict_will_fit(min_young_length, base_time_ms,
693 base_free_regions, target_pause_time_ms)) {
694 // The shortest young length will fit into the target pause time;
695 // we'll now check whether the absolute maximum number of young
696 // regions will fit in the target pause time. If not, we'll do
697 // a binary search between min_young_length and max_young_length.
698 if (predict_will_fit(max_young_length, base_time_ms,
699 base_free_regions, target_pause_time_ms)) {
700 // The maximum young length will fit into the target pause time.
701 // We are done so set min young length to the maximum length (as
702 // the result is assumed to be returned in min_young_length).
703 min_young_length = max_young_length;
704 } else {
705 // The maximum possible number of young regions will not fit within
706 // the target pause time so we'll search for the optimal
707 // length. The loop invariants are:
708 //
709 // min_young_length < max_young_length
710 // min_young_length is known to fit into the target pause time
711 // max_young_length is known not to fit into the target pause time
712 //
713 // Going into the loop we know the above hold as we've just
714 // checked them. Every time around the loop we check whether
715 // the middle value between min_young_length and
716 // max_young_length fits into the target pause time. If it
717 // does, it becomes the new min. If it doesn't, it becomes
718 // the new max. This way we maintain the loop invariants.
720 assert(min_young_length < max_young_length, "invariant");
721 size_t diff = (max_young_length - min_young_length) / 2;
722 while (diff > 0) {
723 size_t young_length = min_young_length + diff;
724 if (predict_will_fit(young_length, base_time_ms,
725 base_free_regions, target_pause_time_ms)) {
726 min_young_length = young_length;
727 } else {
728 max_young_length = young_length;
729 }
730 assert(min_young_length < max_young_length, "invariant");
731 diff = (max_young_length - min_young_length) / 2;
732 }
733 // The results is min_young_length which, according to the
734 // loop invariants, should fit within the target pause time.
736 // These are the post-conditions of the binary search above:
737 assert(min_young_length < max_young_length,
738 "otherwise we should have discovered that max_young_length "
739 "fits into the pause target and not done the binary search");
740 assert(predict_will_fit(min_young_length, base_time_ms,
741 base_free_regions, target_pause_time_ms),
742 "min_young_length, the result of the binary search, should "
743 "fit into the pause target");
744 assert(!predict_will_fit(min_young_length + 1, base_time_ms,
745 base_free_regions, target_pause_time_ms),
746 "min_young_length, the result of the binary search, should be "
747 "optimal, so no larger length should fit into the pause target");
748 }
749 } else {
750 // Even the minimum length doesn't fit into the pause time
751 // target, return it as the result nevertheless.
752 }
753 return base_min_length + min_young_length;
754 }
756 double G1CollectorPolicy::predict_survivor_regions_evac_time() {
757 double survivor_regions_evac_time = 0.0;
758 for (HeapRegion * r = _recorded_survivor_head;
759 r != NULL && r != _recorded_survivor_tail->get_next_young_region();
760 r = r->get_next_young_region()) {
761 survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true);
762 }
763 return survivor_regions_evac_time;
764 }
766 void G1CollectorPolicy::revise_young_list_target_length_if_necessary() {
767 guarantee( adaptive_young_list_length(), "should not call this otherwise" );
769 size_t rs_lengths = _g1->young_list()->sampled_rs_lengths();
770 if (rs_lengths > _rs_lengths_prediction) {
771 // add 10% to avoid having to recalculate often
772 size_t rs_lengths_prediction = rs_lengths * 1100 / 1000;
773 update_young_list_target_length(rs_lengths_prediction);
774 }
775 }
779 HeapWord* G1CollectorPolicy::mem_allocate_work(size_t size,
780 bool is_tlab,
781 bool* gc_overhead_limit_was_exceeded) {
782 guarantee(false, "Not using this policy feature yet.");
783 return NULL;
784 }
786 // This method controls how a collector handles one or more
787 // of its generations being fully allocated.
788 HeapWord* G1CollectorPolicy::satisfy_failed_allocation(size_t size,
789 bool is_tlab) {
790 guarantee(false, "Not using this policy feature yet.");
791 return NULL;
792 }
795 #ifndef PRODUCT
796 bool G1CollectorPolicy::verify_young_ages() {
797 HeapRegion* head = _g1->young_list()->first_region();
798 return
799 verify_young_ages(head, _short_lived_surv_rate_group);
800 // also call verify_young_ages on any additional surv rate groups
801 }
803 bool
804 G1CollectorPolicy::verify_young_ages(HeapRegion* head,
805 SurvRateGroup *surv_rate_group) {
806 guarantee( surv_rate_group != NULL, "pre-condition" );
808 const char* name = surv_rate_group->name();
809 bool ret = true;
810 int prev_age = -1;
812 for (HeapRegion* curr = head;
813 curr != NULL;
814 curr = curr->get_next_young_region()) {
815 SurvRateGroup* group = curr->surv_rate_group();
816 if (group == NULL && !curr->is_survivor()) {
817 gclog_or_tty->print_cr("## %s: encountered NULL surv_rate_group", name);
818 ret = false;
819 }
821 if (surv_rate_group == group) {
822 int age = curr->age_in_surv_rate_group();
824 if (age < 0) {
825 gclog_or_tty->print_cr("## %s: encountered negative age", name);
826 ret = false;
827 }
829 if (age <= prev_age) {
830 gclog_or_tty->print_cr("## %s: region ages are not strictly increasing "
831 "(%d, %d)", name, age, prev_age);
832 ret = false;
833 }
834 prev_age = age;
835 }
836 }
838 return ret;
839 }
840 #endif // PRODUCT
842 void G1CollectorPolicy::record_full_collection_start() {
843 _cur_collection_start_sec = os::elapsedTime();
844 // Release the future to-space so that it is available for compaction into.
845 _g1->set_full_collection();
846 }
848 void G1CollectorPolicy::record_full_collection_end() {
849 // Consider this like a collection pause for the purposes of allocation
850 // since last pause.
851 double end_sec = os::elapsedTime();
852 double full_gc_time_sec = end_sec - _cur_collection_start_sec;
853 double full_gc_time_ms = full_gc_time_sec * 1000.0;
855 _all_full_gc_times_ms->add(full_gc_time_ms);
857 update_recent_gc_times(end_sec, full_gc_time_ms);
859 _g1->clear_full_collection();
861 // "Nuke" the heuristics that control the fully/partially young GC
862 // transitions and make sure we start with fully young GCs after the
863 // Full GC.
864 set_full_young_gcs(true);
865 _last_full_young_gc = false;
866 _should_revert_to_full_young_gcs = false;
867 clear_initiate_conc_mark_if_possible();
868 clear_during_initial_mark_pause();
869 _known_garbage_bytes = 0;
870 _known_garbage_ratio = 0.0;
871 _in_marking_window = false;
872 _in_marking_window_im = false;
874 _short_lived_surv_rate_group->start_adding_regions();
875 // also call this on any additional surv rate groups
877 record_survivor_regions(0, NULL, NULL);
879 _free_regions_at_end_of_collection = _g1->free_regions();
880 // Reset survivors SurvRateGroup.
881 _survivor_surv_rate_group->reset();
882 update_young_list_target_length();
883 _collectionSetChooser->updateAfterFullCollection();
884 }
886 void G1CollectorPolicy::record_stop_world_start() {
887 _stop_world_start = os::elapsedTime();
888 }
890 void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
891 size_t start_used) {
892 if (PrintGCDetails) {
893 gclog_or_tty->stamp(PrintGCTimeStamps);
894 gclog_or_tty->print("[GC pause");
895 gclog_or_tty->print(" (%s)", full_young_gcs() ? "young" : "partial");
896 }
898 // We only need to do this here as the policy will only be applied
899 // to the GC we're about to start. so, no point is calculating this
900 // every time we calculate / recalculate the target young length.
901 update_survivors_policy();
903 assert(_g1->used() == _g1->recalculate_used(),
904 err_msg("sanity, used: "SIZE_FORMAT" recalculate_used: "SIZE_FORMAT,
905 _g1->used(), _g1->recalculate_used()));
907 double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
908 _all_stop_world_times_ms->add(s_w_t_ms);
909 _stop_world_start = 0.0;
911 _cur_collection_start_sec = start_time_sec;
912 _cur_collection_pause_used_at_start_bytes = start_used;
913 _cur_collection_pause_used_regions_at_start = _g1->used_regions();
914 _pending_cards = _g1->pending_card_num();
915 _max_pending_cards = _g1->max_pending_card_num();
917 _bytes_in_collection_set_before_gc = 0;
918 _bytes_copied_during_gc = 0;
920 YoungList* young_list = _g1->young_list();
921 _eden_bytes_before_gc = young_list->eden_used_bytes();
922 _survivor_bytes_before_gc = young_list->survivor_used_bytes();
923 _capacity_before_gc = _g1->capacity();
925 #ifdef DEBUG
926 // initialise these to something well known so that we can spot
927 // if they are not set properly
929 for (int i = 0; i < _parallel_gc_threads; ++i) {
930 _par_last_gc_worker_start_times_ms[i] = -1234.0;
931 _par_last_ext_root_scan_times_ms[i] = -1234.0;
932 _par_last_mark_stack_scan_times_ms[i] = -1234.0;
933 _par_last_update_rs_times_ms[i] = -1234.0;
934 _par_last_update_rs_processed_buffers[i] = -1234.0;
935 _par_last_scan_rs_times_ms[i] = -1234.0;
936 _par_last_obj_copy_times_ms[i] = -1234.0;
937 _par_last_termination_times_ms[i] = -1234.0;
938 _par_last_termination_attempts[i] = -1234.0;
939 _par_last_gc_worker_end_times_ms[i] = -1234.0;
940 _par_last_gc_worker_times_ms[i] = -1234.0;
941 _par_last_gc_worker_other_times_ms[i] = -1234.0;
942 }
943 #endif
945 for (int i = 0; i < _aux_num; ++i) {
946 _cur_aux_times_ms[i] = 0.0;
947 _cur_aux_times_set[i] = false;
948 }
950 // This is initialized to zero here and is set during
951 // the evacuation pause if marking is in progress.
952 _cur_satb_drain_time_ms = 0.0;
954 _last_young_gc_full = false;
956 // do that for any other surv rate groups
957 _short_lived_surv_rate_group->stop_adding_regions();
958 _survivors_age_table.clear();
960 assert( verify_young_ages(), "region age verification" );
961 }
963 void G1CollectorPolicy::record_concurrent_mark_init_end(double
964 mark_init_elapsed_time_ms) {
965 _during_marking = true;
966 assert(!initiate_conc_mark_if_possible(), "we should have cleared it by now");
967 clear_during_initial_mark_pause();
968 _cur_mark_stop_world_time_ms = mark_init_elapsed_time_ms;
969 }
971 void G1CollectorPolicy::record_concurrent_mark_remark_start() {
972 _mark_remark_start_sec = os::elapsedTime();
973 _during_marking = false;
974 }
976 void G1CollectorPolicy::record_concurrent_mark_remark_end() {
977 double end_time_sec = os::elapsedTime();
978 double elapsed_time_ms = (end_time_sec - _mark_remark_start_sec)*1000.0;
979 _concurrent_mark_remark_times_ms->add(elapsed_time_ms);
980 _cur_mark_stop_world_time_ms += elapsed_time_ms;
981 _prev_collection_pause_end_ms += elapsed_time_ms;
983 _mmu_tracker->add_pause(_mark_remark_start_sec, end_time_sec, true);
984 }
986 void G1CollectorPolicy::record_concurrent_mark_cleanup_start() {
987 _mark_cleanup_start_sec = os::elapsedTime();
988 }
990 void G1CollectorPolicy::record_concurrent_mark_cleanup_completed() {
991 _should_revert_to_full_young_gcs = false;
992 _last_full_young_gc = true;
993 _in_marking_window = false;
994 }
996 void G1CollectorPolicy::record_concurrent_pause() {
997 if (_stop_world_start > 0.0) {
998 double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
999 _all_yield_times_ms->add(yield_ms);
1000 }
1001 }
1003 void G1CollectorPolicy::record_concurrent_pause_end() {
1004 }
1006 template<class T>
1007 T sum_of(T* sum_arr, int start, int n, int N) {
1008 T sum = (T)0;
1009 for (int i = 0; i < n; i++) {
1010 int j = (start + i) % N;
1011 sum += sum_arr[j];
1012 }
1013 return sum;
1014 }
1016 void G1CollectorPolicy::print_par_stats(int level,
1017 const char* str,
1018 double* data) {
1019 double min = data[0], max = data[0];
1020 double total = 0.0;
1021 LineBuffer buf(level);
1022 buf.append("[%s (ms):", str);
1023 for (uint i = 0; i < no_of_gc_threads(); ++i) {
1024 double val = data[i];
1025 if (val < min)
1026 min = val;
1027 if (val > max)
1028 max = val;
1029 total += val;
1030 buf.append(" %3.1lf", val);
1031 }
1032 buf.append_and_print_cr("");
1033 double avg = total / (double) no_of_gc_threads();
1034 buf.append_and_print_cr(" Avg: %5.1lf, Min: %5.1lf, Max: %5.1lf, Diff: %5.1lf]",
1035 avg, min, max, max - min);
1036 }
1038 void G1CollectorPolicy::print_par_sizes(int level,
1039 const char* str,
1040 double* data) {
1041 double min = data[0], max = data[0];
1042 double total = 0.0;
1043 LineBuffer buf(level);
1044 buf.append("[%s :", str);
1045 for (uint i = 0; i < no_of_gc_threads(); ++i) {
1046 double val = data[i];
1047 if (val < min)
1048 min = val;
1049 if (val > max)
1050 max = val;
1051 total += val;
1052 buf.append(" %d", (int) val);
1053 }
1054 buf.append_and_print_cr("");
1055 double avg = total / (double) no_of_gc_threads();
1056 buf.append_and_print_cr(" Sum: %d, Avg: %d, Min: %d, Max: %d, Diff: %d]",
1057 (int)total, (int)avg, (int)min, (int)max, (int)max - (int)min);
1058 }
1060 void G1CollectorPolicy::print_stats(int level,
1061 const char* str,
1062 double value) {
1063 LineBuffer(level).append_and_print_cr("[%s: %5.1lf ms]", str, value);
1064 }
1066 void G1CollectorPolicy::print_stats(int level,
1067 const char* str,
1068 int value) {
1069 LineBuffer(level).append_and_print_cr("[%s: %d]", str, value);
1070 }
1072 double G1CollectorPolicy::avg_value(double* data) {
1073 if (G1CollectedHeap::use_parallel_gc_threads()) {
1074 double ret = 0.0;
1075 for (uint i = 0; i < no_of_gc_threads(); ++i) {
1076 ret += data[i];
1077 }
1078 return ret / (double) no_of_gc_threads();
1079 } else {
1080 return data[0];
1081 }
1082 }
1084 double G1CollectorPolicy::max_value(double* data) {
1085 if (G1CollectedHeap::use_parallel_gc_threads()) {
1086 double ret = data[0];
1087 for (uint i = 1; i < no_of_gc_threads(); ++i) {
1088 if (data[i] > ret) {
1089 ret = data[i];
1090 }
1091 }
1092 return ret;
1093 } else {
1094 return data[0];
1095 }
1096 }
1098 double G1CollectorPolicy::sum_of_values(double* data) {
1099 if (G1CollectedHeap::use_parallel_gc_threads()) {
1100 double sum = 0.0;
1101 for (uint i = 0; i < no_of_gc_threads(); i++) {
1102 sum += data[i];
1103 }
1104 return sum;
1105 } else {
1106 return data[0];
1107 }
1108 }
1110 double G1CollectorPolicy::max_sum(double* data1, double* data2) {
1111 double ret = data1[0] + data2[0];
1113 if (G1CollectedHeap::use_parallel_gc_threads()) {
1114 for (uint i = 1; i < no_of_gc_threads(); ++i) {
1115 double data = data1[i] + data2[i];
1116 if (data > ret) {
1117 ret = data;
1118 }
1119 }
1120 }
1121 return ret;
1122 }
1124 // Anything below that is considered to be zero
1125 #define MIN_TIMER_GRANULARITY 0.0000001
1127 void G1CollectorPolicy::record_collection_pause_end(int no_of_gc_threads) {
1128 double end_time_sec = os::elapsedTime();
1129 double elapsed_ms = _last_pause_time_ms;
1130 bool parallel = G1CollectedHeap::use_parallel_gc_threads();
1131 assert(_cur_collection_pause_used_regions_at_start >= cset_region_length(),
1132 "otherwise, the subtraction below does not make sense");
1133 size_t rs_size =
1134 _cur_collection_pause_used_regions_at_start - cset_region_length();
1135 size_t cur_used_bytes = _g1->used();
1136 assert(cur_used_bytes == _g1->recalculate_used(), "It should!");
1137 bool last_pause_included_initial_mark = false;
1138 bool update_stats = !_g1->evacuation_failed();
1139 set_no_of_gc_threads(no_of_gc_threads);
1141 #ifndef PRODUCT
1142 if (G1YoungSurvRateVerbose) {
1143 gclog_or_tty->print_cr("");
1144 _short_lived_surv_rate_group->print();
1145 // do that for any other surv rate groups too
1146 }
1147 #endif // PRODUCT
1149 last_pause_included_initial_mark = during_initial_mark_pause();
1150 if (last_pause_included_initial_mark)
1151 record_concurrent_mark_init_end(0.0);
1153 size_t marking_initiating_used_threshold =
1154 (_g1->capacity() / 100) * InitiatingHeapOccupancyPercent;
1156 if (!_g1->mark_in_progress() && !_last_full_young_gc) {
1157 assert(!last_pause_included_initial_mark, "invariant");
1158 if (cur_used_bytes > marking_initiating_used_threshold) {
1159 if (cur_used_bytes > _prev_collection_pause_used_at_end_bytes) {
1160 assert(!during_initial_mark_pause(), "we should not see this here");
1162 ergo_verbose3(ErgoConcCycles,
1163 "request concurrent cycle initiation",
1164 ergo_format_reason("occupancy higher than threshold")
1165 ergo_format_byte("occupancy")
1166 ergo_format_byte_perc("threshold"),
1167 cur_used_bytes,
1168 marking_initiating_used_threshold,
1169 (double) InitiatingHeapOccupancyPercent);
1171 // Note: this might have already been set, if during the last
1172 // pause we decided to start a cycle but at the beginning of
1173 // this pause we decided to postpone it. That's OK.
1174 set_initiate_conc_mark_if_possible();
1175 } else {
1176 ergo_verbose2(ErgoConcCycles,
1177 "do not request concurrent cycle initiation",
1178 ergo_format_reason("occupancy lower than previous occupancy")
1179 ergo_format_byte("occupancy")
1180 ergo_format_byte("previous occupancy"),
1181 cur_used_bytes,
1182 _prev_collection_pause_used_at_end_bytes);
1183 }
1184 }
1185 }
1187 _prev_collection_pause_used_at_end_bytes = cur_used_bytes;
1189 _mmu_tracker->add_pause(end_time_sec - elapsed_ms/1000.0,
1190 end_time_sec, false);
1192 // This assert is exempted when we're doing parallel collection pauses,
1193 // because the fragmentation caused by the parallel GC allocation buffers
1194 // can lead to more memory being used during collection than was used
1195 // before. Best leave this out until the fragmentation problem is fixed.
1196 // Pauses in which evacuation failed can also lead to negative
1197 // collections, since no space is reclaimed from a region containing an
1198 // object whose evacuation failed.
1199 // Further, we're now always doing parallel collection. But I'm still
1200 // leaving this here as a placeholder for a more precise assertion later.
1201 // (DLD, 10/05.)
1202 assert((true || parallel) // Always using GC LABs now.
1203 || _g1->evacuation_failed()
1204 || _cur_collection_pause_used_at_start_bytes >= cur_used_bytes,
1205 "Negative collection");
1207 size_t freed_bytes =
1208 _cur_collection_pause_used_at_start_bytes - cur_used_bytes;
1209 size_t surviving_bytes = _collection_set_bytes_used_before - freed_bytes;
1211 double survival_fraction =
1212 (double)surviving_bytes/
1213 (double)_collection_set_bytes_used_before;
1215 // These values are used to update the summary information that is
1216 // displayed when TraceGen0Time is enabled, and are output as part
1217 // of the PrintGCDetails output, in the non-parallel case.
1219 double ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms);
1220 double mark_stack_scan_time = avg_value(_par_last_mark_stack_scan_times_ms);
1221 double update_rs_time = avg_value(_par_last_update_rs_times_ms);
1222 double update_rs_processed_buffers =
1223 sum_of_values(_par_last_update_rs_processed_buffers);
1224 double scan_rs_time = avg_value(_par_last_scan_rs_times_ms);
1225 double obj_copy_time = avg_value(_par_last_obj_copy_times_ms);
1226 double termination_time = avg_value(_par_last_termination_times_ms);
1228 double known_time = ext_root_scan_time +
1229 mark_stack_scan_time +
1230 update_rs_time +
1231 scan_rs_time +
1232 obj_copy_time;
1234 double other_time_ms = elapsed_ms;
1236 // Subtract the SATB drain time. It's initialized to zero at the
1237 // start of the pause and is updated during the pause if marking
1238 // is in progress.
1239 other_time_ms -= _cur_satb_drain_time_ms;
1241 if (parallel) {
1242 other_time_ms -= _cur_collection_par_time_ms;
1243 } else {
1244 other_time_ms -= known_time;
1245 }
1247 // Subtract the time taken to clean the card table from the
1248 // current value of "other time"
1249 other_time_ms -= _cur_clear_ct_time_ms;
1251 // Subtract the time spent completing marking in the collection
1252 // set. Note if marking is not in progress during the pause
1253 // the value of _mark_closure_time_ms will be zero.
1254 other_time_ms -= _mark_closure_time_ms;
1256 // TraceGen0Time and TraceGen1Time summary info updating.
1257 _all_pause_times_ms->add(elapsed_ms);
1259 if (update_stats) {
1260 _summary->record_total_time_ms(elapsed_ms);
1261 _summary->record_other_time_ms(other_time_ms);
1263 MainBodySummary* body_summary = _summary->main_body_summary();
1264 assert(body_summary != NULL, "should not be null!");
1266 // This will be non-zero iff marking is currently in progress (i.e.
1267 // _g1->mark_in_progress() == true) and the currrent pause was not
1268 // an initial mark pause. Since the body_summary items are NumberSeqs,
1269 // however, they have to be consistent and updated in lock-step with
1270 // each other. Therefore we unconditionally record the SATB drain
1271 // time - even if it's zero.
1272 body_summary->record_satb_drain_time_ms(_cur_satb_drain_time_ms);
1274 body_summary->record_ext_root_scan_time_ms(ext_root_scan_time);
1275 body_summary->record_mark_stack_scan_time_ms(mark_stack_scan_time);
1276 body_summary->record_update_rs_time_ms(update_rs_time);
1277 body_summary->record_scan_rs_time_ms(scan_rs_time);
1278 body_summary->record_obj_copy_time_ms(obj_copy_time);
1280 if (parallel) {
1281 body_summary->record_parallel_time_ms(_cur_collection_par_time_ms);
1282 body_summary->record_termination_time_ms(termination_time);
1284 double parallel_known_time = known_time + termination_time;
1285 double parallel_other_time = _cur_collection_par_time_ms - parallel_known_time;
1286 body_summary->record_parallel_other_time_ms(parallel_other_time);
1287 }
1289 body_summary->record_mark_closure_time_ms(_mark_closure_time_ms);
1290 body_summary->record_clear_ct_time_ms(_cur_clear_ct_time_ms);
1292 // We exempt parallel collection from this check because Alloc Buffer
1293 // fragmentation can produce negative collections. Same with evac
1294 // failure.
1295 // Further, we're now always doing parallel collection. But I'm still
1296 // leaving this here as a placeholder for a more precise assertion later.
1297 // (DLD, 10/05.
1298 assert((true || parallel)
1299 || _g1->evacuation_failed()
1300 || surviving_bytes <= _collection_set_bytes_used_before,
1301 "Or else negative collection!");
1303 // this is where we update the allocation rate of the application
1304 double app_time_ms =
1305 (_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms);
1306 if (app_time_ms < MIN_TIMER_GRANULARITY) {
1307 // This usually happens due to the timer not having the required
1308 // granularity. Some Linuxes are the usual culprits.
1309 // We'll just set it to something (arbitrarily) small.
1310 app_time_ms = 1.0;
1311 }
1312 // We maintain the invariant that all objects allocated by mutator
1313 // threads will be allocated out of eden regions. So, we can use
1314 // the eden region number allocated since the previous GC to
1315 // calculate the application's allocate rate. The only exception
1316 // to that is humongous objects that are allocated separately. But
1317 // given that humongous object allocations do not really affect
1318 // either the pause's duration nor when the next pause will take
1319 // place we can safely ignore them here.
1320 size_t regions_allocated = eden_cset_region_length();
1321 double alloc_rate_ms = (double) regions_allocated / app_time_ms;
1322 _alloc_rate_ms_seq->add(alloc_rate_ms);
1324 double interval_ms =
1325 (end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
1326 update_recent_gc_times(end_time_sec, elapsed_ms);
1327 _recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
1328 if (recent_avg_pause_time_ratio() < 0.0 ||
1329 (recent_avg_pause_time_ratio() - 1.0 > 0.0)) {
1330 #ifndef PRODUCT
1331 // Dump info to allow post-facto debugging
1332 gclog_or_tty->print_cr("recent_avg_pause_time_ratio() out of bounds");
1333 gclog_or_tty->print_cr("-------------------------------------------");
1334 gclog_or_tty->print_cr("Recent GC Times (ms):");
1335 _recent_gc_times_ms->dump();
1336 gclog_or_tty->print_cr("(End Time=%3.3f) Recent GC End Times (s):", end_time_sec);
1337 _recent_prev_end_times_for_all_gcs_sec->dump();
1338 gclog_or_tty->print_cr("GC = %3.3f, Interval = %3.3f, Ratio = %3.3f",
1339 _recent_gc_times_ms->sum(), interval_ms, recent_avg_pause_time_ratio());
1340 // In debug mode, terminate the JVM if the user wants to debug at this point.
1341 assert(!G1FailOnFPError, "Debugging data for CR 6898948 has been dumped above");
1342 #endif // !PRODUCT
1343 // Clip ratio between 0.0 and 1.0, and continue. This will be fixed in
1344 // CR 6902692 by redoing the manner in which the ratio is incrementally computed.
1345 if (_recent_avg_pause_time_ratio < 0.0) {
1346 _recent_avg_pause_time_ratio = 0.0;
1347 } else {
1348 assert(_recent_avg_pause_time_ratio - 1.0 > 0.0, "Ctl-point invariant");
1349 _recent_avg_pause_time_ratio = 1.0;
1350 }
1351 }
1352 }
1354 for (int i = 0; i < _aux_num; ++i) {
1355 if (_cur_aux_times_set[i]) {
1356 _all_aux_times_ms[i].add(_cur_aux_times_ms[i]);
1357 }
1358 }
1360 // PrintGCDetails output
1361 if (PrintGCDetails) {
1362 bool print_marking_info =
1363 _g1->mark_in_progress() && !last_pause_included_initial_mark;
1365 gclog_or_tty->print_cr("%s, %1.8lf secs]",
1366 (last_pause_included_initial_mark) ? " (initial-mark)" : "",
1367 elapsed_ms / 1000.0);
1369 if (print_marking_info) {
1370 print_stats(1, "SATB Drain Time", _cur_satb_drain_time_ms);
1371 }
1373 if (parallel) {
1374 print_stats(1, "Parallel Time", _cur_collection_par_time_ms);
1375 print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms);
1376 print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms);
1377 if (print_marking_info) {
1378 print_par_stats(2, "Mark Stack Scanning", _par_last_mark_stack_scan_times_ms);
1379 }
1380 print_par_stats(2, "Update RS", _par_last_update_rs_times_ms);
1381 print_par_sizes(3, "Processed Buffers", _par_last_update_rs_processed_buffers);
1382 print_par_stats(2, "Scan RS", _par_last_scan_rs_times_ms);
1383 print_par_stats(2, "Object Copy", _par_last_obj_copy_times_ms);
1384 print_par_stats(2, "Termination", _par_last_termination_times_ms);
1385 print_par_sizes(3, "Termination Attempts", _par_last_termination_attempts);
1386 print_par_stats(2, "GC Worker End", _par_last_gc_worker_end_times_ms);
1388 for (int i = 0; i < _parallel_gc_threads; i++) {
1389 _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] - _par_last_gc_worker_start_times_ms[i];
1391 double worker_known_time = _par_last_ext_root_scan_times_ms[i] +
1392 _par_last_mark_stack_scan_times_ms[i] +
1393 _par_last_update_rs_times_ms[i] +
1394 _par_last_scan_rs_times_ms[i] +
1395 _par_last_obj_copy_times_ms[i] +
1396 _par_last_termination_times_ms[i];
1398 _par_last_gc_worker_other_times_ms[i] = _cur_collection_par_time_ms - worker_known_time;
1399 }
1400 print_par_stats(2, "GC Worker", _par_last_gc_worker_times_ms);
1401 print_par_stats(2, "GC Worker Other", _par_last_gc_worker_other_times_ms);
1402 } else {
1403 print_stats(1, "Ext Root Scanning", ext_root_scan_time);
1404 if (print_marking_info) {
1405 print_stats(1, "Mark Stack Scanning", mark_stack_scan_time);
1406 }
1407 print_stats(1, "Update RS", update_rs_time);
1408 print_stats(2, "Processed Buffers", (int)update_rs_processed_buffers);
1409 print_stats(1, "Scan RS", scan_rs_time);
1410 print_stats(1, "Object Copying", obj_copy_time);
1411 }
1412 if (print_marking_info) {
1413 print_stats(1, "Complete CSet Marking", _mark_closure_time_ms);
1414 }
1415 print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
1416 #ifndef PRODUCT
1417 print_stats(1, "Cur Clear CC", _cur_clear_cc_time_ms);
1418 print_stats(1, "Cum Clear CC", _cum_clear_cc_time_ms);
1419 print_stats(1, "Min Clear CC", _min_clear_cc_time_ms);
1420 print_stats(1, "Max Clear CC", _max_clear_cc_time_ms);
1421 if (_num_cc_clears > 0) {
1422 print_stats(1, "Avg Clear CC", _cum_clear_cc_time_ms / ((double)_num_cc_clears));
1423 }
1424 #endif
1425 print_stats(1, "Other", other_time_ms);
1426 print_stats(2, "Choose CSet",
1427 (_recorded_young_cset_choice_time_ms +
1428 _recorded_non_young_cset_choice_time_ms));
1429 print_stats(2, "Ref Proc", _cur_ref_proc_time_ms);
1430 print_stats(2, "Ref Enq", _cur_ref_enq_time_ms);
1431 print_stats(2, "Free CSet",
1432 (_recorded_young_free_cset_time_ms +
1433 _recorded_non_young_free_cset_time_ms));
1435 for (int i = 0; i < _aux_num; ++i) {
1436 if (_cur_aux_times_set[i]) {
1437 char buffer[96];
1438 sprintf(buffer, "Aux%d", i);
1439 print_stats(1, buffer, _cur_aux_times_ms[i]);
1440 }
1441 }
1442 }
1444 // Update the efficiency-since-mark vars.
1445 double proc_ms = elapsed_ms * (double) _parallel_gc_threads;
1446 if (elapsed_ms < MIN_TIMER_GRANULARITY) {
1447 // This usually happens due to the timer not having the required
1448 // granularity. Some Linuxes are the usual culprits.
1449 // We'll just set it to something (arbitrarily) small.
1450 proc_ms = 1.0;
1451 }
1452 double cur_efficiency = (double) freed_bytes / proc_ms;
1454 bool new_in_marking_window = _in_marking_window;
1455 bool new_in_marking_window_im = false;
1456 if (during_initial_mark_pause()) {
1457 new_in_marking_window = true;
1458 new_in_marking_window_im = true;
1459 }
1461 if (_last_full_young_gc) {
1462 if (!last_pause_included_initial_mark) {
1463 ergo_verbose2(ErgoPartiallyYoungGCs,
1464 "start partially-young GCs",
1465 ergo_format_byte_perc("known garbage"),
1466 _known_garbage_bytes, _known_garbage_ratio * 100.0);
1467 set_full_young_gcs(false);
1468 } else {
1469 ergo_verbose0(ErgoPartiallyYoungGCs,
1470 "do not start partially-young GCs",
1471 ergo_format_reason("concurrent cycle is about to start"));
1472 }
1473 _last_full_young_gc = false;
1474 }
1476 if ( !_last_young_gc_full ) {
1477 if (_should_revert_to_full_young_gcs) {
1478 ergo_verbose2(ErgoPartiallyYoungGCs,
1479 "end partially-young GCs",
1480 ergo_format_reason("partially-young GCs end requested")
1481 ergo_format_byte_perc("known garbage"),
1482 _known_garbage_bytes, _known_garbage_ratio * 100.0);
1483 set_full_young_gcs(true);
1484 } else if (_known_garbage_ratio < 0.05) {
1485 ergo_verbose3(ErgoPartiallyYoungGCs,
1486 "end partially-young GCs",
1487 ergo_format_reason("known garbage percent lower than threshold")
1488 ergo_format_byte_perc("known garbage")
1489 ergo_format_perc("threshold"),
1490 _known_garbage_bytes, _known_garbage_ratio * 100.0,
1491 0.05 * 100.0);
1492 set_full_young_gcs(true);
1493 } else if (adaptive_young_list_length() &&
1494 (get_gc_eff_factor() * cur_efficiency < predict_young_gc_eff())) {
1495 ergo_verbose5(ErgoPartiallyYoungGCs,
1496 "end partially-young GCs",
1497 ergo_format_reason("current GC efficiency lower than "
1498 "predicted fully-young GC efficiency")
1499 ergo_format_double("GC efficiency factor")
1500 ergo_format_double("current GC efficiency")
1501 ergo_format_double("predicted fully-young GC efficiency")
1502 ergo_format_byte_perc("known garbage"),
1503 get_gc_eff_factor(), cur_efficiency,
1504 predict_young_gc_eff(),
1505 _known_garbage_bytes, _known_garbage_ratio * 100.0);
1506 set_full_young_gcs(true);
1507 }
1508 }
1509 _should_revert_to_full_young_gcs = false;
1511 if (_last_young_gc_full && !_during_marking) {
1512 _young_gc_eff_seq->add(cur_efficiency);
1513 }
1515 _short_lived_surv_rate_group->start_adding_regions();
1516 // do that for any other surv rate groupsx
1518 if (update_stats) {
1519 double pause_time_ms = elapsed_ms;
1521 size_t diff = 0;
1522 if (_max_pending_cards >= _pending_cards)
1523 diff = _max_pending_cards - _pending_cards;
1524 _pending_card_diff_seq->add((double) diff);
1526 double cost_per_card_ms = 0.0;
1527 if (_pending_cards > 0) {
1528 cost_per_card_ms = update_rs_time / (double) _pending_cards;
1529 _cost_per_card_ms_seq->add(cost_per_card_ms);
1530 }
1532 size_t cards_scanned = _g1->cards_scanned();
1534 double cost_per_entry_ms = 0.0;
1535 if (cards_scanned > 10) {
1536 cost_per_entry_ms = scan_rs_time / (double) cards_scanned;
1537 if (_last_young_gc_full)
1538 _cost_per_entry_ms_seq->add(cost_per_entry_ms);
1539 else
1540 _partially_young_cost_per_entry_ms_seq->add(cost_per_entry_ms);
1541 }
1543 if (_max_rs_lengths > 0) {
1544 double cards_per_entry_ratio =
1545 (double) cards_scanned / (double) _max_rs_lengths;
1546 if (_last_young_gc_full)
1547 _fully_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
1548 else
1549 _partially_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
1550 }
1552 size_t rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
1553 if (rs_length_diff >= 0)
1554 _rs_length_diff_seq->add((double) rs_length_diff);
1556 size_t copied_bytes = surviving_bytes;
1557 double cost_per_byte_ms = 0.0;
1558 if (copied_bytes > 0) {
1559 cost_per_byte_ms = obj_copy_time / (double) copied_bytes;
1560 if (_in_marking_window)
1561 _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms);
1562 else
1563 _cost_per_byte_ms_seq->add(cost_per_byte_ms);
1564 }
1566 double all_other_time_ms = pause_time_ms -
1567 (update_rs_time + scan_rs_time + obj_copy_time +
1568 _mark_closure_time_ms + termination_time);
1570 double young_other_time_ms = 0.0;
1571 if (young_cset_region_length() > 0) {
1572 young_other_time_ms =
1573 _recorded_young_cset_choice_time_ms +
1574 _recorded_young_free_cset_time_ms;
1575 _young_other_cost_per_region_ms_seq->add(young_other_time_ms /
1576 (double) young_cset_region_length());
1577 }
1578 double non_young_other_time_ms = 0.0;
1579 if (old_cset_region_length() > 0) {
1580 non_young_other_time_ms =
1581 _recorded_non_young_cset_choice_time_ms +
1582 _recorded_non_young_free_cset_time_ms;
1584 _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms /
1585 (double) old_cset_region_length());
1586 }
1588 double constant_other_time_ms = all_other_time_ms -
1589 (young_other_time_ms + non_young_other_time_ms);
1590 _constant_other_time_ms_seq->add(constant_other_time_ms);
1592 double survival_ratio = 0.0;
1593 if (_bytes_in_collection_set_before_gc > 0) {
1594 survival_ratio = (double) _bytes_copied_during_gc /
1595 (double) _bytes_in_collection_set_before_gc;
1596 }
1598 _pending_cards_seq->add((double) _pending_cards);
1599 _rs_lengths_seq->add((double) _max_rs_lengths);
1601 double expensive_region_limit_ms =
1602 (double) MaxGCPauseMillis - predict_constant_other_time_ms();
1603 if (expensive_region_limit_ms < 0.0) {
1604 // this means that the other time was predicted to be longer than
1605 // than the max pause time
1606 expensive_region_limit_ms = (double) MaxGCPauseMillis;
1607 }
1608 _expensive_region_limit_ms = expensive_region_limit_ms;
1609 }
1611 _in_marking_window = new_in_marking_window;
1612 _in_marking_window_im = new_in_marking_window_im;
1613 _free_regions_at_end_of_collection = _g1->free_regions();
1614 update_young_list_target_length();
1616 // Note that _mmu_tracker->max_gc_time() returns the time in seconds.
1617 double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0;
1618 adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms);
1620 assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end.");
1621 }
1623 #define EXT_SIZE_FORMAT "%d%s"
1624 #define EXT_SIZE_PARAMS(bytes) \
1625 byte_size_in_proper_unit((bytes)), \
1626 proper_unit_for_byte_size((bytes))
1628 void G1CollectorPolicy::print_heap_transition() {
1629 if (PrintGCDetails) {
1630 YoungList* young_list = _g1->young_list();
1631 size_t eden_bytes = young_list->eden_used_bytes();
1632 size_t survivor_bytes = young_list->survivor_used_bytes();
1633 size_t used_before_gc = _cur_collection_pause_used_at_start_bytes;
1634 size_t used = _g1->used();
1635 size_t capacity = _g1->capacity();
1636 size_t eden_capacity =
1637 (_young_list_target_length * HeapRegion::GrainBytes) - survivor_bytes;
1639 gclog_or_tty->print_cr(
1640 " [Eden: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT") "
1641 "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" "
1642 "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"
1643 EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]",
1644 EXT_SIZE_PARAMS(_eden_bytes_before_gc),
1645 EXT_SIZE_PARAMS(_prev_eden_capacity),
1646 EXT_SIZE_PARAMS(eden_bytes),
1647 EXT_SIZE_PARAMS(eden_capacity),
1648 EXT_SIZE_PARAMS(_survivor_bytes_before_gc),
1649 EXT_SIZE_PARAMS(survivor_bytes),
1650 EXT_SIZE_PARAMS(used_before_gc),
1651 EXT_SIZE_PARAMS(_capacity_before_gc),
1652 EXT_SIZE_PARAMS(used),
1653 EXT_SIZE_PARAMS(capacity));
1655 _prev_eden_capacity = eden_capacity;
1656 } else if (PrintGC) {
1657 _g1->print_size_transition(gclog_or_tty,
1658 _cur_collection_pause_used_at_start_bytes,
1659 _g1->used(), _g1->capacity());
1660 }
1661 }
1663 void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
1664 double update_rs_processed_buffers,
1665 double goal_ms) {
1666 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
1667 ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine();
1669 if (G1UseAdaptiveConcRefinement) {
1670 const int k_gy = 3, k_gr = 6;
1671 const double inc_k = 1.1, dec_k = 0.9;
1673 int g = cg1r->green_zone();
1674 if (update_rs_time > goal_ms) {
1675 g = (int)(g * dec_k); // Can become 0, that's OK. That would mean a mutator-only processing.
1676 } else {
1677 if (update_rs_time < goal_ms && update_rs_processed_buffers > g) {
1678 g = (int)MAX2(g * inc_k, g + 1.0);
1679 }
1680 }
1681 // Change the refinement threads params
1682 cg1r->set_green_zone(g);
1683 cg1r->set_yellow_zone(g * k_gy);
1684 cg1r->set_red_zone(g * k_gr);
1685 cg1r->reinitialize_threads();
1687 int processing_threshold_delta = MAX2((int)(cg1r->green_zone() * sigma()), 1);
1688 int processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta,
1689 cg1r->yellow_zone());
1690 // Change the barrier params
1691 dcqs.set_process_completed_threshold(processing_threshold);
1692 dcqs.set_max_completed_queue(cg1r->red_zone());
1693 }
1695 int curr_queue_size = dcqs.completed_buffers_num();
1696 if (curr_queue_size >= cg1r->yellow_zone()) {
1697 dcqs.set_completed_queue_padding(curr_queue_size);
1698 } else {
1699 dcqs.set_completed_queue_padding(0);
1700 }
1701 dcqs.notify_if_necessary();
1702 }
1704 double
1705 G1CollectorPolicy::
1706 predict_young_collection_elapsed_time_ms(size_t adjustment) {
1707 guarantee( adjustment == 0 || adjustment == 1, "invariant" );
1709 G1CollectedHeap* g1h = G1CollectedHeap::heap();
1710 size_t young_num = g1h->young_list()->length();
1711 if (young_num == 0)
1712 return 0.0;
1714 young_num += adjustment;
1715 size_t pending_cards = predict_pending_cards();
1716 size_t rs_lengths = g1h->young_list()->sampled_rs_lengths() +
1717 predict_rs_length_diff();
1718 size_t card_num;
1719 if (full_young_gcs())
1720 card_num = predict_young_card_num(rs_lengths);
1721 else
1722 card_num = predict_non_young_card_num(rs_lengths);
1723 size_t young_byte_size = young_num * HeapRegion::GrainBytes;
1724 double accum_yg_surv_rate =
1725 _short_lived_surv_rate_group->accum_surv_rate(adjustment);
1727 size_t bytes_to_copy =
1728 (size_t) (accum_yg_surv_rate * (double) HeapRegion::GrainBytes);
1730 return
1731 predict_rs_update_time_ms(pending_cards) +
1732 predict_rs_scan_time_ms(card_num) +
1733 predict_object_copy_time_ms(bytes_to_copy) +
1734 predict_young_other_time_ms(young_num) +
1735 predict_constant_other_time_ms();
1736 }
1738 double
1739 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) {
1740 size_t rs_length = predict_rs_length_diff();
1741 size_t card_num;
1742 if (full_young_gcs())
1743 card_num = predict_young_card_num(rs_length);
1744 else
1745 card_num = predict_non_young_card_num(rs_length);
1746 return predict_base_elapsed_time_ms(pending_cards, card_num);
1747 }
1749 double
1750 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
1751 size_t scanned_cards) {
1752 return
1753 predict_rs_update_time_ms(pending_cards) +
1754 predict_rs_scan_time_ms(scanned_cards) +
1755 predict_constant_other_time_ms();
1756 }
1758 double
1759 G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
1760 bool young) {
1761 size_t rs_length = hr->rem_set()->occupied();
1762 size_t card_num;
1763 if (full_young_gcs())
1764 card_num = predict_young_card_num(rs_length);
1765 else
1766 card_num = predict_non_young_card_num(rs_length);
1767 size_t bytes_to_copy = predict_bytes_to_copy(hr);
1769 double region_elapsed_time_ms =
1770 predict_rs_scan_time_ms(card_num) +
1771 predict_object_copy_time_ms(bytes_to_copy);
1773 if (young)
1774 region_elapsed_time_ms += predict_young_other_time_ms(1);
1775 else
1776 region_elapsed_time_ms += predict_non_young_other_time_ms(1);
1778 return region_elapsed_time_ms;
1779 }
1781 size_t
1782 G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
1783 size_t bytes_to_copy;
1784 if (hr->is_marked())
1785 bytes_to_copy = hr->max_live_bytes();
1786 else {
1787 guarantee( hr->is_young() && hr->age_in_surv_rate_group() != -1,
1788 "invariant" );
1789 int age = hr->age_in_surv_rate_group();
1790 double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group());
1791 bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate);
1792 }
1794 return bytes_to_copy;
1795 }
1797 void
1798 G1CollectorPolicy::init_cset_region_lengths(size_t eden_cset_region_length,
1799 size_t survivor_cset_region_length) {
1800 _eden_cset_region_length = eden_cset_region_length;
1801 _survivor_cset_region_length = survivor_cset_region_length;
1802 _old_cset_region_length = 0;
1803 }
1805 void G1CollectorPolicy::set_recorded_rs_lengths(size_t rs_lengths) {
1806 _recorded_rs_lengths = rs_lengths;
1807 }
1809 void G1CollectorPolicy::check_if_region_is_too_expensive(double
1810 predicted_time_ms) {
1811 // I don't think we need to do this when in young GC mode since
1812 // marking will be initiated next time we hit the soft limit anyway...
1813 if (predicted_time_ms > _expensive_region_limit_ms) {
1814 ergo_verbose2(ErgoPartiallyYoungGCs,
1815 "request partially-young GCs end",
1816 ergo_format_reason("predicted region time higher than threshold")
1817 ergo_format_ms("predicted region time")
1818 ergo_format_ms("threshold"),
1819 predicted_time_ms, _expensive_region_limit_ms);
1820 // no point in doing another partial one
1821 _should_revert_to_full_young_gcs = true;
1822 }
1823 }
1825 void G1CollectorPolicy::update_recent_gc_times(double end_time_sec,
1826 double elapsed_ms) {
1827 _recent_gc_times_ms->add(elapsed_ms);
1828 _recent_prev_end_times_for_all_gcs_sec->add(end_time_sec);
1829 _prev_collection_pause_end_ms = end_time_sec * 1000.0;
1830 }
1832 size_t G1CollectorPolicy::expansion_amount() {
1833 double recent_gc_overhead = recent_avg_pause_time_ratio() * 100.0;
1834 double threshold = _gc_overhead_perc;
1835 if (recent_gc_overhead > threshold) {
1836 // We will double the existing space, or take
1837 // G1ExpandByPercentOfAvailable % of the available expansion
1838 // space, whichever is smaller, bounded below by a minimum
1839 // expansion (unless that's all that's left.)
1840 const size_t min_expand_bytes = 1*M;
1841 size_t reserved_bytes = _g1->max_capacity();
1842 size_t committed_bytes = _g1->capacity();
1843 size_t uncommitted_bytes = reserved_bytes - committed_bytes;
1844 size_t expand_bytes;
1845 size_t expand_bytes_via_pct =
1846 uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
1847 expand_bytes = MIN2(expand_bytes_via_pct, committed_bytes);
1848 expand_bytes = MAX2(expand_bytes, min_expand_bytes);
1849 expand_bytes = MIN2(expand_bytes, uncommitted_bytes);
1851 ergo_verbose5(ErgoHeapSizing,
1852 "attempt heap expansion",
1853 ergo_format_reason("recent GC overhead higher than "
1854 "threshold after GC")
1855 ergo_format_perc("recent GC overhead")
1856 ergo_format_perc("threshold")
1857 ergo_format_byte("uncommitted")
1858 ergo_format_byte_perc("calculated expansion amount"),
1859 recent_gc_overhead, threshold,
1860 uncommitted_bytes,
1861 expand_bytes_via_pct, (double) G1ExpandByPercentOfAvailable);
1863 return expand_bytes;
1864 } else {
1865 return 0;
1866 }
1867 }
1869 class CountCSClosure: public HeapRegionClosure {
1870 G1CollectorPolicy* _g1_policy;
1871 public:
1872 CountCSClosure(G1CollectorPolicy* g1_policy) :
1873 _g1_policy(g1_policy) {}
1874 bool doHeapRegion(HeapRegion* r) {
1875 _g1_policy->_bytes_in_collection_set_before_gc += r->used();
1876 return false;
1877 }
1878 };
1880 void G1CollectorPolicy::count_CS_bytes_used() {
1881 CountCSClosure cs_closure(this);
1882 _g1->collection_set_iterate(&cs_closure);
1883 }
1885 void G1CollectorPolicy::print_summary(int level,
1886 const char* str,
1887 NumberSeq* seq) const {
1888 double sum = seq->sum();
1889 LineBuffer(level + 1).append_and_print_cr("%-24s = %8.2lf s (avg = %8.2lf ms)",
1890 str, sum / 1000.0, seq->avg());
1891 }
1893 void G1CollectorPolicy::print_summary_sd(int level,
1894 const char* str,
1895 NumberSeq* seq) const {
1896 print_summary(level, str, seq);
1897 LineBuffer(level + 6).append_and_print_cr("(num = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
1898 seq->num(), seq->sd(), seq->maximum());
1899 }
1901 void G1CollectorPolicy::check_other_times(int level,
1902 NumberSeq* other_times_ms,
1903 NumberSeq* calc_other_times_ms) const {
1904 bool should_print = false;
1905 LineBuffer buf(level + 2);
1907 double max_sum = MAX2(fabs(other_times_ms->sum()),
1908 fabs(calc_other_times_ms->sum()));
1909 double min_sum = MIN2(fabs(other_times_ms->sum()),
1910 fabs(calc_other_times_ms->sum()));
1911 double sum_ratio = max_sum / min_sum;
1912 if (sum_ratio > 1.1) {
1913 should_print = true;
1914 buf.append_and_print_cr("## CALCULATED OTHER SUM DOESN'T MATCH RECORDED ###");
1915 }
1917 double max_avg = MAX2(fabs(other_times_ms->avg()),
1918 fabs(calc_other_times_ms->avg()));
1919 double min_avg = MIN2(fabs(other_times_ms->avg()),
1920 fabs(calc_other_times_ms->avg()));
1921 double avg_ratio = max_avg / min_avg;
1922 if (avg_ratio > 1.1) {
1923 should_print = true;
1924 buf.append_and_print_cr("## CALCULATED OTHER AVG DOESN'T MATCH RECORDED ###");
1925 }
1927 if (other_times_ms->sum() < -0.01) {
1928 buf.append_and_print_cr("## RECORDED OTHER SUM IS NEGATIVE ###");
1929 }
1931 if (other_times_ms->avg() < -0.01) {
1932 buf.append_and_print_cr("## RECORDED OTHER AVG IS NEGATIVE ###");
1933 }
1935 if (calc_other_times_ms->sum() < -0.01) {
1936 should_print = true;
1937 buf.append_and_print_cr("## CALCULATED OTHER SUM IS NEGATIVE ###");
1938 }
1940 if (calc_other_times_ms->avg() < -0.01) {
1941 should_print = true;
1942 buf.append_and_print_cr("## CALCULATED OTHER AVG IS NEGATIVE ###");
1943 }
1945 if (should_print)
1946 print_summary(level, "Other(Calc)", calc_other_times_ms);
1947 }
1949 void G1CollectorPolicy::print_summary(PauseSummary* summary) const {
1950 bool parallel = G1CollectedHeap::use_parallel_gc_threads();
1951 MainBodySummary* body_summary = summary->main_body_summary();
1952 if (summary->get_total_seq()->num() > 0) {
1953 print_summary_sd(0, "Evacuation Pauses", summary->get_total_seq());
1954 if (body_summary != NULL) {
1955 print_summary(1, "SATB Drain", body_summary->get_satb_drain_seq());
1956 if (parallel) {
1957 print_summary(1, "Parallel Time", body_summary->get_parallel_seq());
1958 print_summary(2, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
1959 print_summary(2, "Mark Stack Scanning", body_summary->get_mark_stack_scan_seq());
1960 print_summary(2, "Update RS", body_summary->get_update_rs_seq());
1961 print_summary(2, "Scan RS", body_summary->get_scan_rs_seq());
1962 print_summary(2, "Object Copy", body_summary->get_obj_copy_seq());
1963 print_summary(2, "Termination", body_summary->get_termination_seq());
1964 print_summary(2, "Parallel Other", body_summary->get_parallel_other_seq());
1965 {
1966 NumberSeq* other_parts[] = {
1967 body_summary->get_ext_root_scan_seq(),
1968 body_summary->get_mark_stack_scan_seq(),
1969 body_summary->get_update_rs_seq(),
1970 body_summary->get_scan_rs_seq(),
1971 body_summary->get_obj_copy_seq(),
1972 body_summary->get_termination_seq()
1973 };
1974 NumberSeq calc_other_times_ms(body_summary->get_parallel_seq(),
1975 6, other_parts);
1976 check_other_times(2, body_summary->get_parallel_other_seq(),
1977 &calc_other_times_ms);
1978 }
1979 } else {
1980 print_summary(1, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
1981 print_summary(1, "Mark Stack Scanning", body_summary->get_mark_stack_scan_seq());
1982 print_summary(1, "Update RS", body_summary->get_update_rs_seq());
1983 print_summary(1, "Scan RS", body_summary->get_scan_rs_seq());
1984 print_summary(1, "Object Copy", body_summary->get_obj_copy_seq());
1985 }
1986 }
1987 print_summary(1, "Mark Closure", body_summary->get_mark_closure_seq());
1988 print_summary(1, "Clear CT", body_summary->get_clear_ct_seq());
1989 print_summary(1, "Other", summary->get_other_seq());
1990 {
1991 if (body_summary != NULL) {
1992 NumberSeq calc_other_times_ms;
1993 if (parallel) {
1994 // parallel
1995 NumberSeq* other_parts[] = {
1996 body_summary->get_satb_drain_seq(),
1997 body_summary->get_parallel_seq(),
1998 body_summary->get_clear_ct_seq()
1999 };
2000 calc_other_times_ms = NumberSeq(summary->get_total_seq(),
2001 3, other_parts);
2002 } else {
2003 // serial
2004 NumberSeq* other_parts[] = {
2005 body_summary->get_satb_drain_seq(),
2006 body_summary->get_update_rs_seq(),
2007 body_summary->get_ext_root_scan_seq(),
2008 body_summary->get_mark_stack_scan_seq(),
2009 body_summary->get_scan_rs_seq(),
2010 body_summary->get_obj_copy_seq()
2011 };
2012 calc_other_times_ms = NumberSeq(summary->get_total_seq(),
2013 6, other_parts);
2014 }
2015 check_other_times(1, summary->get_other_seq(), &calc_other_times_ms);
2016 }
2017 }
2018 } else {
2019 LineBuffer(1).append_and_print_cr("none");
2020 }
2021 LineBuffer(0).append_and_print_cr("");
2022 }
2024 void G1CollectorPolicy::print_tracing_info() const {
2025 if (TraceGen0Time) {
2026 gclog_or_tty->print_cr("ALL PAUSES");
2027 print_summary_sd(0, "Total", _all_pause_times_ms);
2028 gclog_or_tty->print_cr("");
2029 gclog_or_tty->print_cr("");
2030 gclog_or_tty->print_cr(" Full Young GC Pauses: %8d", _full_young_pause_num);
2031 gclog_or_tty->print_cr(" Partial Young GC Pauses: %8d", _partial_young_pause_num);
2032 gclog_or_tty->print_cr("");
2034 gclog_or_tty->print_cr("EVACUATION PAUSES");
2035 print_summary(_summary);
2037 gclog_or_tty->print_cr("MISC");
2038 print_summary_sd(0, "Stop World", _all_stop_world_times_ms);
2039 print_summary_sd(0, "Yields", _all_yield_times_ms);
2040 for (int i = 0; i < _aux_num; ++i) {
2041 if (_all_aux_times_ms[i].num() > 0) {
2042 char buffer[96];
2043 sprintf(buffer, "Aux%d", i);
2044 print_summary_sd(0, buffer, &_all_aux_times_ms[i]);
2045 }
2046 }
2047 }
2048 if (TraceGen1Time) {
2049 if (_all_full_gc_times_ms->num() > 0) {
2050 gclog_or_tty->print("\n%4d full_gcs: total time = %8.2f s",
2051 _all_full_gc_times_ms->num(),
2052 _all_full_gc_times_ms->sum() / 1000.0);
2053 gclog_or_tty->print_cr(" (avg = %8.2fms).", _all_full_gc_times_ms->avg());
2054 gclog_or_tty->print_cr(" [std. dev = %8.2f ms, max = %8.2f ms]",
2055 _all_full_gc_times_ms->sd(),
2056 _all_full_gc_times_ms->maximum());
2057 }
2058 }
2059 }
2061 void G1CollectorPolicy::print_yg_surv_rate_info() const {
2062 #ifndef PRODUCT
2063 _short_lived_surv_rate_group->print_surv_rate_summary();
2064 // add this call for any other surv rate groups
2065 #endif // PRODUCT
2066 }
2068 #ifndef PRODUCT
2069 // for debugging, bit of a hack...
2070 static char*
2071 region_num_to_mbs(int length) {
2072 static char buffer[64];
2073 double bytes = (double) (length * HeapRegion::GrainBytes);
2074 double mbs = bytes / (double) (1024 * 1024);
2075 sprintf(buffer, "%7.2lfMB", mbs);
2076 return buffer;
2077 }
2078 #endif // PRODUCT
2080 size_t G1CollectorPolicy::max_regions(int purpose) {
2081 switch (purpose) {
2082 case GCAllocForSurvived:
2083 return _max_survivor_regions;
2084 case GCAllocForTenured:
2085 return REGIONS_UNLIMITED;
2086 default:
2087 ShouldNotReachHere();
2088 return REGIONS_UNLIMITED;
2089 };
2090 }
2092 void G1CollectorPolicy::update_max_gc_locker_expansion() {
2093 size_t expansion_region_num = 0;
2094 if (GCLockerEdenExpansionPercent > 0) {
2095 double perc = (double) GCLockerEdenExpansionPercent / 100.0;
2096 double expansion_region_num_d = perc * (double) _young_list_target_length;
2097 // We use ceiling so that if expansion_region_num_d is > 0.0 (but
2098 // less than 1.0) we'll get 1.
2099 expansion_region_num = (size_t) ceil(expansion_region_num_d);
2100 } else {
2101 assert(expansion_region_num == 0, "sanity");
2102 }
2103 _young_list_max_length = _young_list_target_length + expansion_region_num;
2104 assert(_young_list_target_length <= _young_list_max_length, "post-condition");
2105 }
2107 // Calculates survivor space parameters.
2108 void G1CollectorPolicy::update_survivors_policy() {
2109 double max_survivor_regions_d =
2110 (double) _young_list_target_length / (double) SurvivorRatio;
2111 // We use ceiling so that if max_survivor_regions_d is > 0.0 (but
2112 // smaller than 1.0) we'll get 1.
2113 _max_survivor_regions = (size_t) ceil(max_survivor_regions_d);
2115 _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
2116 HeapRegion::GrainWords * _max_survivor_regions);
2117 }
2119 #ifndef PRODUCT
2120 class HRSortIndexIsOKClosure: public HeapRegionClosure {
2121 CollectionSetChooser* _chooser;
2122 public:
2123 HRSortIndexIsOKClosure(CollectionSetChooser* chooser) :
2124 _chooser(chooser) {}
2126 bool doHeapRegion(HeapRegion* r) {
2127 if (!r->continuesHumongous()) {
2128 assert(_chooser->regionProperlyOrdered(r), "Ought to be.");
2129 }
2130 return false;
2131 }
2132 };
2134 bool G1CollectorPolicy::assertMarkedBytesDataOK() {
2135 HRSortIndexIsOKClosure cl(_collectionSetChooser);
2136 _g1->heap_region_iterate(&cl);
2137 return true;
2138 }
2139 #endif
2141 bool G1CollectorPolicy::force_initial_mark_if_outside_cycle(
2142 GCCause::Cause gc_cause) {
2143 bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
2144 if (!during_cycle) {
2145 ergo_verbose1(ErgoConcCycles,
2146 "request concurrent cycle initiation",
2147 ergo_format_reason("requested by GC cause")
2148 ergo_format_str("GC cause"),
2149 GCCause::to_string(gc_cause));
2150 set_initiate_conc_mark_if_possible();
2151 return true;
2152 } else {
2153 ergo_verbose1(ErgoConcCycles,
2154 "do not request concurrent cycle initiation",
2155 ergo_format_reason("concurrent cycle already in progress")
2156 ergo_format_str("GC cause"),
2157 GCCause::to_string(gc_cause));
2158 return false;
2159 }
2160 }
2162 void
2163 G1CollectorPolicy::decide_on_conc_mark_initiation() {
2164 // We are about to decide on whether this pause will be an
2165 // initial-mark pause.
2167 // First, during_initial_mark_pause() should not be already set. We
2168 // will set it here if we have to. However, it should be cleared by
2169 // the end of the pause (it's only set for the duration of an
2170 // initial-mark pause).
2171 assert(!during_initial_mark_pause(), "pre-condition");
2173 if (initiate_conc_mark_if_possible()) {
2174 // We had noticed on a previous pause that the heap occupancy has
2175 // gone over the initiating threshold and we should start a
2176 // concurrent marking cycle. So we might initiate one.
2178 bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
2179 if (!during_cycle) {
2180 // The concurrent marking thread is not "during a cycle", i.e.,
2181 // it has completed the last one. So we can go ahead and
2182 // initiate a new cycle.
2184 set_during_initial_mark_pause();
2185 // We do not allow non-full young GCs during marking.
2186 if (!full_young_gcs()) {
2187 set_full_young_gcs(true);
2188 ergo_verbose0(ErgoPartiallyYoungGCs,
2189 "end partially-young GCs",
2190 ergo_format_reason("concurrent cycle is about to start"));
2191 }
2193 // And we can now clear initiate_conc_mark_if_possible() as
2194 // we've already acted on it.
2195 clear_initiate_conc_mark_if_possible();
2197 ergo_verbose0(ErgoConcCycles,
2198 "initiate concurrent cycle",
2199 ergo_format_reason("concurrent cycle initiation requested"));
2200 } else {
2201 // The concurrent marking thread is still finishing up the
2202 // previous cycle. If we start one right now the two cycles
2203 // overlap. In particular, the concurrent marking thread might
2204 // be in the process of clearing the next marking bitmap (which
2205 // we will use for the next cycle if we start one). Starting a
2206 // cycle now will be bad given that parts of the marking
2207 // information might get cleared by the marking thread. And we
2208 // cannot wait for the marking thread to finish the cycle as it
2209 // periodically yields while clearing the next marking bitmap
2210 // and, if it's in a yield point, it's waiting for us to
2211 // finish. So, at this point we will not start a cycle and we'll
2212 // let the concurrent marking thread complete the last one.
2213 ergo_verbose0(ErgoConcCycles,
2214 "do not initiate concurrent cycle",
2215 ergo_format_reason("concurrent cycle already in progress"));
2216 }
2217 }
2218 }
2220 class KnownGarbageClosure: public HeapRegionClosure {
2221 CollectionSetChooser* _hrSorted;
2223 public:
2224 KnownGarbageClosure(CollectionSetChooser* hrSorted) :
2225 _hrSorted(hrSorted)
2226 {}
2228 bool doHeapRegion(HeapRegion* r) {
2229 // We only include humongous regions in collection
2230 // sets when concurrent mark shows that their contained object is
2231 // unreachable.
2233 // Do we have any marking information for this region?
2234 if (r->is_marked()) {
2235 // We don't include humongous regions in collection
2236 // sets because we collect them immediately at the end of a marking
2237 // cycle. We also don't include young regions because we *must*
2238 // include them in the next collection pause.
2239 if (!r->isHumongous() && !r->is_young()) {
2240 _hrSorted->addMarkedHeapRegion(r);
2241 }
2242 }
2243 return false;
2244 }
2245 };
2247 class ParKnownGarbageHRClosure: public HeapRegionClosure {
2248 CollectionSetChooser* _hrSorted;
2249 jint _marked_regions_added;
2250 jint _chunk_size;
2251 jint _cur_chunk_idx;
2252 jint _cur_chunk_end; // Cur chunk [_cur_chunk_idx, _cur_chunk_end)
2253 int _worker;
2254 int _invokes;
2256 void get_new_chunk() {
2257 _cur_chunk_idx = _hrSorted->getParMarkedHeapRegionChunk(_chunk_size);
2258 _cur_chunk_end = _cur_chunk_idx + _chunk_size;
2259 }
2260 void add_region(HeapRegion* r) {
2261 if (_cur_chunk_idx == _cur_chunk_end) {
2262 get_new_chunk();
2263 }
2264 assert(_cur_chunk_idx < _cur_chunk_end, "postcondition");
2265 _hrSorted->setMarkedHeapRegion(_cur_chunk_idx, r);
2266 _marked_regions_added++;
2267 _cur_chunk_idx++;
2268 }
2270 public:
2271 ParKnownGarbageHRClosure(CollectionSetChooser* hrSorted,
2272 jint chunk_size,
2273 int worker) :
2274 _hrSorted(hrSorted), _chunk_size(chunk_size), _worker(worker),
2275 _marked_regions_added(0), _cur_chunk_idx(0), _cur_chunk_end(0),
2276 _invokes(0)
2277 {}
2279 bool doHeapRegion(HeapRegion* r) {
2280 // We only include humongous regions in collection
2281 // sets when concurrent mark shows that their contained object is
2282 // unreachable.
2283 _invokes++;
2285 // Do we have any marking information for this region?
2286 if (r->is_marked()) {
2287 // We don't include humongous regions in collection
2288 // sets because we collect them immediately at the end of a marking
2289 // cycle.
2290 // We also do not include young regions in collection sets
2291 if (!r->isHumongous() && !r->is_young()) {
2292 add_region(r);
2293 }
2294 }
2295 return false;
2296 }
2297 jint marked_regions_added() { return _marked_regions_added; }
2298 int invokes() { return _invokes; }
2299 };
2301 class ParKnownGarbageTask: public AbstractGangTask {
2302 CollectionSetChooser* _hrSorted;
2303 jint _chunk_size;
2304 G1CollectedHeap* _g1;
2305 public:
2306 ParKnownGarbageTask(CollectionSetChooser* hrSorted, jint chunk_size) :
2307 AbstractGangTask("ParKnownGarbageTask"),
2308 _hrSorted(hrSorted), _chunk_size(chunk_size),
2309 _g1(G1CollectedHeap::heap())
2310 {}
2312 void work(int i) {
2313 ParKnownGarbageHRClosure parKnownGarbageCl(_hrSorted, _chunk_size, i);
2314 // Back to zero for the claim value.
2315 _g1->heap_region_par_iterate_chunked(&parKnownGarbageCl, i,
2316 _g1->workers()->active_workers(),
2317 HeapRegion::InitialClaimValue);
2318 jint regions_added = parKnownGarbageCl.marked_regions_added();
2319 _hrSorted->incNumMarkedHeapRegions(regions_added);
2320 if (G1PrintParCleanupStats) {
2321 gclog_or_tty->print_cr(" Thread %d called %d times, added %d regions to list.",
2322 i, parKnownGarbageCl.invokes(), regions_added);
2323 }
2324 }
2325 };
2327 void
2328 G1CollectorPolicy::record_concurrent_mark_cleanup_end(int no_of_gc_threads) {
2329 double start_sec;
2330 if (G1PrintParCleanupStats) {
2331 start_sec = os::elapsedTime();
2332 }
2334 _collectionSetChooser->clearMarkedHeapRegions();
2335 double clear_marked_end_sec;
2336 if (G1PrintParCleanupStats) {
2337 clear_marked_end_sec = os::elapsedTime();
2338 gclog_or_tty->print_cr(" clear marked regions: %8.3f ms.",
2339 (clear_marked_end_sec - start_sec) * 1000.0);
2340 }
2342 if (G1CollectedHeap::use_parallel_gc_threads()) {
2343 const size_t OverpartitionFactor = 4;
2344 size_t WorkUnit;
2345 // The use of MinChunkSize = 8 in the original code
2346 // causes some assertion failures when the total number of
2347 // region is less than 8. The code here tries to fix that.
2348 // Should the original code also be fixed?
2349 if (no_of_gc_threads > 0) {
2350 const size_t MinWorkUnit =
2351 MAX2(_g1->n_regions() / no_of_gc_threads, (size_t) 1U);
2352 WorkUnit =
2353 MAX2(_g1->n_regions() / (no_of_gc_threads * OverpartitionFactor),
2354 MinWorkUnit);
2355 } else {
2356 assert(no_of_gc_threads > 0,
2357 "The active gc workers should be greater than 0");
2358 // In a product build do something reasonable to avoid a crash.
2359 const size_t MinWorkUnit =
2360 MAX2(_g1->n_regions() / ParallelGCThreads, (size_t) 1U);
2361 WorkUnit =
2362 MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor),
2363 MinWorkUnit);
2364 }
2365 _collectionSetChooser->prepareForAddMarkedHeapRegionsPar(_g1->n_regions(),
2366 WorkUnit);
2367 ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser,
2368 (int) WorkUnit);
2369 _g1->workers()->run_task(&parKnownGarbageTask);
2371 assert(_g1->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
2372 "sanity check");
2373 } else {
2374 KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
2375 _g1->heap_region_iterate(&knownGarbagecl);
2376 }
2377 double known_garbage_end_sec;
2378 if (G1PrintParCleanupStats) {
2379 known_garbage_end_sec = os::elapsedTime();
2380 gclog_or_tty->print_cr(" compute known garbage: %8.3f ms.",
2381 (known_garbage_end_sec - clear_marked_end_sec) * 1000.0);
2382 }
2384 _collectionSetChooser->sortMarkedHeapRegions();
2385 double end_sec = os::elapsedTime();
2386 if (G1PrintParCleanupStats) {
2387 gclog_or_tty->print_cr(" sorting: %8.3f ms.",
2388 (end_sec - known_garbage_end_sec) * 1000.0);
2389 }
2391 double elapsed_time_ms = (end_sec - _mark_cleanup_start_sec) * 1000.0;
2392 _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms);
2393 _cur_mark_stop_world_time_ms += elapsed_time_ms;
2394 _prev_collection_pause_end_ms += elapsed_time_ms;
2395 _mmu_tracker->add_pause(_mark_cleanup_start_sec, end_sec, true);
2396 }
2398 // Add the heap region at the head of the non-incremental collection set
2399 void G1CollectorPolicy::add_old_region_to_cset(HeapRegion* hr) {
2400 assert(_inc_cset_build_state == Active, "Precondition");
2401 assert(!hr->is_young(), "non-incremental add of young region");
2403 if (_g1->mark_in_progress())
2404 _g1->concurrent_mark()->registerCSetRegion(hr);
2406 assert(!hr->in_collection_set(), "should not already be in the CSet");
2407 hr->set_in_collection_set(true);
2408 hr->set_next_in_collection_set(_collection_set);
2409 _collection_set = hr;
2410 _collection_set_bytes_used_before += hr->used();
2411 _g1->register_region_with_in_cset_fast_test(hr);
2412 size_t rs_length = hr->rem_set()->occupied();
2413 _recorded_rs_lengths += rs_length;
2414 _old_cset_region_length += 1;
2415 }
2417 // Initialize the per-collection-set information
2418 void G1CollectorPolicy::start_incremental_cset_building() {
2419 assert(_inc_cset_build_state == Inactive, "Precondition");
2421 _inc_cset_head = NULL;
2422 _inc_cset_tail = NULL;
2423 _inc_cset_bytes_used_before = 0;
2425 _inc_cset_max_finger = 0;
2426 _inc_cset_recorded_rs_lengths = 0;
2427 _inc_cset_predicted_elapsed_time_ms = 0;
2428 _inc_cset_build_state = Active;
2429 }
2431 void G1CollectorPolicy::add_to_incremental_cset_info(HeapRegion* hr, size_t rs_length) {
2432 // This routine is used when:
2433 // * adding survivor regions to the incremental cset at the end of an
2434 // evacuation pause,
2435 // * adding the current allocation region to the incremental cset
2436 // when it is retired, and
2437 // * updating existing policy information for a region in the
2438 // incremental cset via young list RSet sampling.
2439 // Therefore this routine may be called at a safepoint by the
2440 // VM thread, or in-between safepoints by mutator threads (when
2441 // retiring the current allocation region) or a concurrent
2442 // refine thread (RSet sampling).
2444 double region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, true);
2445 size_t used_bytes = hr->used();
2447 _inc_cset_recorded_rs_lengths += rs_length;
2448 _inc_cset_predicted_elapsed_time_ms += region_elapsed_time_ms;
2450 _inc_cset_bytes_used_before += used_bytes;
2452 // Cache the values we have added to the aggregated informtion
2453 // in the heap region in case we have to remove this region from
2454 // the incremental collection set, or it is updated by the
2455 // rset sampling code
2456 hr->set_recorded_rs_length(rs_length);
2457 hr->set_predicted_elapsed_time_ms(region_elapsed_time_ms);
2458 }
2460 void G1CollectorPolicy::remove_from_incremental_cset_info(HeapRegion* hr) {
2461 // This routine is currently only called as part of the updating of
2462 // existing policy information for regions in the incremental cset that
2463 // is performed by the concurrent refine thread(s) as part of young list
2464 // RSet sampling. Therefore we should not be at a safepoint.
2466 assert(!SafepointSynchronize::is_at_safepoint(), "should not be at safepoint");
2467 assert(hr->is_young(), "it should be");
2469 size_t used_bytes = hr->used();
2470 size_t old_rs_length = hr->recorded_rs_length();
2471 double old_elapsed_time_ms = hr->predicted_elapsed_time_ms();
2473 // Subtract the old recorded/predicted policy information for
2474 // the given heap region from the collection set info.
2475 _inc_cset_recorded_rs_lengths -= old_rs_length;
2476 _inc_cset_predicted_elapsed_time_ms -= old_elapsed_time_ms;
2478 _inc_cset_bytes_used_before -= used_bytes;
2480 // Clear the values cached in the heap region
2481 hr->set_recorded_rs_length(0);
2482 hr->set_predicted_elapsed_time_ms(0);
2483 }
2485 void G1CollectorPolicy::update_incremental_cset_info(HeapRegion* hr, size_t new_rs_length) {
2486 // Update the collection set information that is dependent on the new RS length
2487 assert(hr->is_young(), "Precondition");
2489 remove_from_incremental_cset_info(hr);
2490 add_to_incremental_cset_info(hr, new_rs_length);
2491 }
2493 void G1CollectorPolicy::add_region_to_incremental_cset_common(HeapRegion* hr) {
2494 assert(hr->is_young(), "invariant");
2495 assert(hr->young_index_in_cset() > -1, "should have already been set");
2496 assert(_inc_cset_build_state == Active, "Precondition");
2498 // We need to clear and set the cached recorded/cached collection set
2499 // information in the heap region here (before the region gets added
2500 // to the collection set). An individual heap region's cached values
2501 // are calculated, aggregated with the policy collection set info,
2502 // and cached in the heap region here (initially) and (subsequently)
2503 // by the Young List sampling code.
2505 size_t rs_length = hr->rem_set()->occupied();
2506 add_to_incremental_cset_info(hr, rs_length);
2508 HeapWord* hr_end = hr->end();
2509 _inc_cset_max_finger = MAX2(_inc_cset_max_finger, hr_end);
2511 assert(!hr->in_collection_set(), "invariant");
2512 hr->set_in_collection_set(true);
2513 assert( hr->next_in_collection_set() == NULL, "invariant");
2515 _g1->register_region_with_in_cset_fast_test(hr);
2516 }
2518 // Add the region at the RHS of the incremental cset
2519 void G1CollectorPolicy::add_region_to_incremental_cset_rhs(HeapRegion* hr) {
2520 // We should only ever be appending survivors at the end of a pause
2521 assert( hr->is_survivor(), "Logic");
2523 // Do the 'common' stuff
2524 add_region_to_incremental_cset_common(hr);
2526 // Now add the region at the right hand side
2527 if (_inc_cset_tail == NULL) {
2528 assert(_inc_cset_head == NULL, "invariant");
2529 _inc_cset_head = hr;
2530 } else {
2531 _inc_cset_tail->set_next_in_collection_set(hr);
2532 }
2533 _inc_cset_tail = hr;
2534 }
2536 // Add the region to the LHS of the incremental cset
2537 void G1CollectorPolicy::add_region_to_incremental_cset_lhs(HeapRegion* hr) {
2538 // Survivors should be added to the RHS at the end of a pause
2539 assert(!hr->is_survivor(), "Logic");
2541 // Do the 'common' stuff
2542 add_region_to_incremental_cset_common(hr);
2544 // Add the region at the left hand side
2545 hr->set_next_in_collection_set(_inc_cset_head);
2546 if (_inc_cset_head == NULL) {
2547 assert(_inc_cset_tail == NULL, "Invariant");
2548 _inc_cset_tail = hr;
2549 }
2550 _inc_cset_head = hr;
2551 }
2553 #ifndef PRODUCT
2554 void G1CollectorPolicy::print_collection_set(HeapRegion* list_head, outputStream* st) {
2555 assert(list_head == inc_cset_head() || list_head == collection_set(), "must be");
2557 st->print_cr("\nCollection_set:");
2558 HeapRegion* csr = list_head;
2559 while (csr != NULL) {
2560 HeapRegion* next = csr->next_in_collection_set();
2561 assert(csr->in_collection_set(), "bad CS");
2562 st->print_cr(" [%08x-%08x], t: %08x, P: %08x, N: %08x, C: %08x, "
2563 "age: %4d, y: %d, surv: %d",
2564 csr->bottom(), csr->end(),
2565 csr->top(),
2566 csr->prev_top_at_mark_start(),
2567 csr->next_top_at_mark_start(),
2568 csr->top_at_conc_mark_count(),
2569 csr->age_in_surv_rate_group_cond(),
2570 csr->is_young(),
2571 csr->is_survivor());
2572 csr = next;
2573 }
2574 }
2575 #endif // !PRODUCT
2577 void G1CollectorPolicy::choose_collection_set(double target_pause_time_ms) {
2578 // Set this here - in case we're not doing young collections.
2579 double non_young_start_time_sec = os::elapsedTime();
2581 YoungList* young_list = _g1->young_list();
2583 guarantee(target_pause_time_ms > 0.0,
2584 err_msg("target_pause_time_ms = %1.6lf should be positive",
2585 target_pause_time_ms));
2586 guarantee(_collection_set == NULL, "Precondition");
2588 double base_time_ms = predict_base_elapsed_time_ms(_pending_cards);
2589 double predicted_pause_time_ms = base_time_ms;
2591 double time_remaining_ms = target_pause_time_ms - base_time_ms;
2593 ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
2594 "start choosing CSet",
2595 ergo_format_ms("predicted base time")
2596 ergo_format_ms("remaining time")
2597 ergo_format_ms("target pause time"),
2598 base_time_ms, time_remaining_ms, target_pause_time_ms);
2600 // the 10% and 50% values are arbitrary...
2601 double threshold = 0.10 * target_pause_time_ms;
2602 if (time_remaining_ms < threshold) {
2603 double prev_time_remaining_ms = time_remaining_ms;
2604 time_remaining_ms = 0.50 * target_pause_time_ms;
2605 ergo_verbose3(ErgoCSetConstruction,
2606 "adjust remaining time",
2607 ergo_format_reason("remaining time lower than threshold")
2608 ergo_format_ms("remaining time")
2609 ergo_format_ms("threshold")
2610 ergo_format_ms("adjusted remaining time"),
2611 prev_time_remaining_ms, threshold, time_remaining_ms);
2612 }
2614 size_t expansion_bytes = _g1->expansion_regions() * HeapRegion::GrainBytes;
2616 HeapRegion* hr;
2617 double young_start_time_sec = os::elapsedTime();
2619 _collection_set_bytes_used_before = 0;
2620 _last_young_gc_full = full_young_gcs() ? true : false;
2622 if (_last_young_gc_full) {
2623 ++_full_young_pause_num;
2624 } else {
2625 ++_partial_young_pause_num;
2626 }
2628 // The young list is laid with the survivor regions from the previous
2629 // pause are appended to the RHS of the young list, i.e.
2630 // [Newly Young Regions ++ Survivors from last pause].
2632 size_t survivor_region_length = young_list->survivor_length();
2633 size_t eden_region_length = young_list->length() - survivor_region_length;
2634 init_cset_region_lengths(eden_region_length, survivor_region_length);
2635 hr = young_list->first_survivor_region();
2636 while (hr != NULL) {
2637 assert(hr->is_survivor(), "badly formed young list");
2638 hr->set_young();
2639 hr = hr->get_next_young_region();
2640 }
2642 // Clear the fields that point to the survivor list - they are all young now.
2643 young_list->clear_survivors();
2645 if (_g1->mark_in_progress())
2646 _g1->concurrent_mark()->register_collection_set_finger(_inc_cset_max_finger);
2648 _collection_set = _inc_cset_head;
2649 _collection_set_bytes_used_before = _inc_cset_bytes_used_before;
2650 time_remaining_ms -= _inc_cset_predicted_elapsed_time_ms;
2651 predicted_pause_time_ms += _inc_cset_predicted_elapsed_time_ms;
2653 ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
2654 "add young regions to CSet",
2655 ergo_format_region("eden")
2656 ergo_format_region("survivors")
2657 ergo_format_ms("predicted young region time"),
2658 eden_region_length, survivor_region_length,
2659 _inc_cset_predicted_elapsed_time_ms);
2661 // The number of recorded young regions is the incremental
2662 // collection set's current size
2663 set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths);
2665 double young_end_time_sec = os::elapsedTime();
2666 _recorded_young_cset_choice_time_ms =
2667 (young_end_time_sec - young_start_time_sec) * 1000.0;
2669 // We are doing young collections so reset this.
2670 non_young_start_time_sec = young_end_time_sec;
2672 if (!full_young_gcs()) {
2673 bool should_continue = true;
2674 NumberSeq seq;
2675 double avg_prediction = 100000000000000000.0; // something very large
2677 double prev_predicted_pause_time_ms = predicted_pause_time_ms;
2678 do {
2679 // Note that add_old_region_to_cset() increments the
2680 // _old_cset_region_length field and cset_region_length() returns the
2681 // sum of _eden_cset_region_length, _survivor_cset_region_length, and
2682 // _old_cset_region_length. So, as old regions are added to the
2683 // CSet, _old_cset_region_length will be incremented and
2684 // cset_region_length(), which is used below, will always reflect
2685 // the the total number of regions added up to this point to the CSet.
2687 hr = _collectionSetChooser->getNextMarkedRegion(time_remaining_ms,
2688 avg_prediction);
2689 if (hr != NULL) {
2690 _g1->old_set_remove(hr);
2691 double predicted_time_ms = predict_region_elapsed_time_ms(hr, false);
2692 time_remaining_ms -= predicted_time_ms;
2693 predicted_pause_time_ms += predicted_time_ms;
2694 add_old_region_to_cset(hr);
2695 seq.add(predicted_time_ms);
2696 avg_prediction = seq.avg() + seq.sd();
2697 }
2699 should_continue = true;
2700 if (hr == NULL) {
2701 // No need for an ergo verbose message here,
2702 // getNextMarkRegion() does this when it returns NULL.
2703 should_continue = false;
2704 } else {
2705 if (adaptive_young_list_length()) {
2706 if (time_remaining_ms < 0.0) {
2707 ergo_verbose1(ErgoCSetConstruction,
2708 "stop adding old regions to CSet",
2709 ergo_format_reason("remaining time is lower than 0")
2710 ergo_format_ms("remaining time"),
2711 time_remaining_ms);
2712 should_continue = false;
2713 }
2714 } else {
2715 if (cset_region_length() >= _young_list_fixed_length) {
2716 ergo_verbose2(ErgoCSetConstruction,
2717 "stop adding old regions to CSet",
2718 ergo_format_reason("CSet length reached target")
2719 ergo_format_region("CSet")
2720 ergo_format_region("young target"),
2721 cset_region_length(), _young_list_fixed_length);
2722 should_continue = false;
2723 }
2724 }
2725 }
2726 } while (should_continue);
2728 if (!adaptive_young_list_length() &&
2729 cset_region_length() < _young_list_fixed_length) {
2730 ergo_verbose2(ErgoCSetConstruction,
2731 "request partially-young GCs end",
2732 ergo_format_reason("CSet length lower than target")
2733 ergo_format_region("CSet")
2734 ergo_format_region("young target"),
2735 cset_region_length(), _young_list_fixed_length);
2736 _should_revert_to_full_young_gcs = true;
2737 }
2739 ergo_verbose2(ErgoCSetConstruction | ErgoHigh,
2740 "add old regions to CSet",
2741 ergo_format_region("old")
2742 ergo_format_ms("predicted old region time"),
2743 old_cset_region_length(),
2744 predicted_pause_time_ms - prev_predicted_pause_time_ms);
2745 }
2747 stop_incremental_cset_building();
2749 count_CS_bytes_used();
2751 ergo_verbose5(ErgoCSetConstruction,
2752 "finish choosing CSet",
2753 ergo_format_region("eden")
2754 ergo_format_region("survivors")
2755 ergo_format_region("old")
2756 ergo_format_ms("predicted pause time")
2757 ergo_format_ms("target pause time"),
2758 eden_region_length, survivor_region_length,
2759 old_cset_region_length(),
2760 predicted_pause_time_ms, target_pause_time_ms);
2762 double non_young_end_time_sec = os::elapsedTime();
2763 _recorded_non_young_cset_choice_time_ms =
2764 (non_young_end_time_sec - non_young_start_time_sec) * 1000.0;
2765 }