annotate src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @ 4710:41406797186b

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