annotate src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @ 4023:c6a6e936dc68

7096030: G1: PrintGCDetails enhancements 7102445: G1: Unnecessary Resource allocations during RSet scanning Summary: Add a new per-worker thread line in the PrintGCDetails output. GC Worker Other is the difference between the elapsed time for the parallel phase of the evacuation pause and the sum of the times of the sub-phases (external root scanning, mark stack scanning, RSet updating, RSet scanning, object copying, and termination) for that worker. During RSet scanning, stack allocate DirtyCardToOopClosure objects; allocating these in a resource area was causing abnormally high GC Worker Other times while the worker thread freed ResourceArea chunks. Reviewed-by: tonyp, jwilhelm, brutisso
author johnc
date Sun, 23 Oct 2011 23:06:06 -0700
parents 074f0252cc13
children dbfcbecbb2dc
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 #define PREDICTIONS_VERBOSE 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41 // <NEW PREDICTION>
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 // Different defaults for different number of GC threads
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 // 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
45 // numbers of GC threads and choosing them based on the results
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 // all the same
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 static double rs_length_diff_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49 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
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 static double cost_per_card_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53 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
54 };
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 // all the same
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 static double fully_young_cards_per_entry_ratio_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58 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
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_entry_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 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
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 static double cost_per_byte_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 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
67 };
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 // these should be pretty consistent
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 static double constant_other_time_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71 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
72 };
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 young_other_cost_per_region_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76 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
77 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 static double non_young_other_cost_per_region_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 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
81 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
83 // </NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
84
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
85 // Help class for avoiding interleaved logging
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
86 class LineBuffer: public StackObj {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
87
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
88 private:
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
89 static const int BUFFER_LEN = 1024;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
90 static const int INDENT_CHARS = 3;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
91 char _buffer[BUFFER_LEN];
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
92 int _indent_level;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
93 int _cur;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
94
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
95 void vappend(const char* format, va_list ap) {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
96 int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
97 if (res != -1) {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
98 _cur += res;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
99 } else {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
100 DEBUG_ONLY(warning("buffer too small in LineBuffer");)
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
101 _buffer[BUFFER_LEN -1] = 0;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
102 _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
103 }
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 public:
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
107 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
108 for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
109 _buffer[_cur] = ' ';
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 }
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 #ifndef PRODUCT
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
114 ~LineBuffer() {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
115 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
116 }
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
117 #endif
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 void append(const char* format, ...) {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
120 va_list ap;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
121 va_start(ap, format);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
122 vappend(format, ap);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
123 va_end(ap);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
124 }
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
125
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
126 void append_and_print_cr(const char* format, ...) {
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
127 va_list ap;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
128 va_start(ap, format);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
129 vappend(format, ap);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
130 va_end(ap);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
131 gclog_or_tty->print_cr("%s", _buffer);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
132 _cur = _indent_level * INDENT_CHARS;
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
133 }
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
134 };
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
135
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 G1CollectorPolicy::G1CollectorPolicy() :
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
137 _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
138 ? ParallelGCThreads : 1),
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
139
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 _n_pauses(0),
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
141 _recent_rs_scan_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 _recent_pause_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 _recent_rs_sizes(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 _all_pause_times_ms(new NumberSeq()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 _stop_world_start(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 _all_stop_world_times_ms(new NumberSeq()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 _all_yield_times_ms(new NumberSeq()),
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
149 _using_new_ratio_calculations(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 _all_mod_union_times_ms(new NumberSeq()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
153 _summary(new Summary()),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3976
diff changeset
155 _cur_clear_ct_time_ms(0.0),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3976
diff changeset
156
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3976
diff changeset
157 _cur_ref_proc_time_ms(0.0),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3976
diff changeset
158 _cur_ref_enq_time_ms(0.0),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3976
diff changeset
159
890
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
160 #ifndef PRODUCT
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
161 _min_clear_cc_time_ms(-1.0),
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
162 _max_clear_cc_time_ms(-1.0),
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
163 _cur_clear_cc_time_ms(0.0),
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
164 _cum_clear_cc_time_ms(0.0),
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
165 _num_cc_clears(0L),
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
166 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
167
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
168 _region_num_young(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
169 _region_num_tenured(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 _prev_region_num_young(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171 _prev_region_num_tenured(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 _aux_num(10),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 _all_aux_times_ms(new NumberSeq[_aux_num]),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175 _cur_aux_start_times_ms(new double[_aux_num]),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 _cur_aux_times_ms(new double[_aux_num]),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 _cur_aux_times_set(new bool[_aux_num]),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179 _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
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 // <NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
184 _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185 _prev_collection_pause_end_ms(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 _pending_card_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188 _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
189 _fully_young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190 _partially_young_cards_per_entry_ratio_seq(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 _partially_young_cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 _cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 _non_young_other_cost_per_region_ms_seq(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 _scanned_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 _rs_lengths_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
205 _pause_time_target_ms((double) MaxGCPauseMillis),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 // </NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 _full_young_gcs(true),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 _full_young_pause_num(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 _partial_young_pause_num(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 _during_marking(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 _in_marking_window(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 _in_marking_window_im(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 _known_garbage_ratio(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 _known_garbage_bytes(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220 _young_gc_eff_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222 _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
223
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
224 _recent_CS_bytes_used_before(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 _recent_CS_bytes_surviving(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
226
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
227 _recent_avg_pause_time_ratio(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
228
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 _all_full_gc_times_ms(new NumberSeq()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231 // G1PausesBtwnConcMark defaults to -1
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232 // so the hack is to do the cast QQQ FIXME
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 _pauses_btwn_concurrent_mark((size_t)G1PausesBtwnConcMark),
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
234 _initiate_conc_mark_if_possible(false),
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
235 _during_initial_mark_pause(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236 _should_revert_to_full_young_gcs(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 _last_full_young_gc(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
239 _eden_bytes_before_gc(0),
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
240 _survivor_bytes_before_gc(0),
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
241 _capacity_before_gc(0),
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
242
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 _prev_collection_pause_used_at_end_bytes(0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245 _collection_set(NULL),
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
246 _collection_set_size(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
247 _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
248
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
249 // Incremental CSet attributes
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
250 _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
251 _inc_cset_head(NULL),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
252 _inc_cset_tail(NULL),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
253 _inc_cset_size(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
254 _inc_cset_young_index(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
255 _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
256 _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
257 _inc_cset_recorded_young_bytes(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
258 _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
259 _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
260 _inc_cset_predicted_bytes_to_copy(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
261
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
262 #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
263 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
264 #endif // _MSC_VER
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
265
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
266 _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
267 G1YoungSurvRateNumRegionsSummary)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
268 _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor",
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
269 G1YoungSurvRateNumRegionsSummary)),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
270 // add here any more surv rate groups
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
271 _recorded_survivor_regions(0),
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
272 _recorded_survivor_head(NULL),
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
273 _recorded_survivor_tail(NULL),
1356
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
274 _survivors_age_table(true),
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
275
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
276 _gc_overhead_perc(0.0) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
277
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 936
diff changeset
278 // 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
279 // 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
280 // so it's done as soon as possible.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 936
diff changeset
281 HeapRegion::setup_heap_region_size(Arguments::min_heap_size());
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1111
diff changeset
282 HeapRegionRemSet::setup_remset_size();
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 936
diff changeset
283
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
284 G1ErgoVerbose::initialize();
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
285 if (PrintAdaptiveSizePolicy) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
286 // 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
287 G1ErgoVerbose::set_enabled(true);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
288 // 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
289 // 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
290 // changed in the future.
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
291 G1ErgoVerbose::set_level(ErgoHigh);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
292 } else {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
293 G1ErgoVerbose::set_enabled(false);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
294 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
295
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
296 // Verify PLAB sizes
3986
65a8ff39a6da 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 3982
diff changeset
297 const size_t region_size = HeapRegion::GrainWords;
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
298 if (YoungPLABSize > region_size || OldPLABSize > region_size) {
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
299 char buffer[128];
3986
65a8ff39a6da 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 3982
diff changeset
300 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
301 OldPLABSize > region_size ? "Old" : "Young", region_size);
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
302 vm_exit_during_initialization(buffer);
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
303 }
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
304
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
305 _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
306 _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
307
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
308 _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
309 _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
310 _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
311
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
312 _par_last_update_rs_times_ms = new double[_parallel_gc_threads];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
313 _par_last_update_rs_processed_buffers = new double[_parallel_gc_threads];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
314
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
315 _par_last_scan_rs_times_ms = new double[_parallel_gc_threads];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
316
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
317 _par_last_obj_copy_times_ms = new double[_parallel_gc_threads];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
318
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
319 _par_last_termination_times_ms = new double[_parallel_gc_threads];
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
320 _par_last_termination_attempts = new double[_parallel_gc_threads];
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
321 _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
322 _par_last_gc_worker_times_ms = new double[_parallel_gc_threads];
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
323 _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
324
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
325 // start conservatively
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
326 _expensive_region_limit_ms = 0.5 * (double) MaxGCPauseMillis;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
327
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
328 // <NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
329
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
330 int index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
331 if (ParallelGCThreads == 0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
332 index = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
333 else if (ParallelGCThreads > 8)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
334 index = 7;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
335 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 index = ParallelGCThreads - 1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
337
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
338 _pending_card_diff_seq->add(0.0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
339 _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
340 _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
341 _fully_young_cards_per_entry_ratio_seq->add(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
342 fully_young_cards_per_entry_ratio_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
343 _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
344 _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
345 _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
346 _young_other_cost_per_region_ms_seq->add(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
347 young_other_cost_per_region_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
348 _non_young_other_cost_per_region_ms_seq->add(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
349 non_young_other_cost_per_region_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
350
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
351 // </NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
352
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
353 // 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
354 // 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
355 // 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
356 // 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
357 // 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
358 // 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
359 // 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
360 // 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
361 // 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
362
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 // 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
364 // 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
365 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
366 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
367 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
368 "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
369 }
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 }
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 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
372 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
373 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
374 "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
375 }
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
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
378 // 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
379 // 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
380 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
381 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
382 // 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
383 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
384 } 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
385 // 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
386 // 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
387 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
388 "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
389 }
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
390 }
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
391
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
392 // 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
393 // 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
394 // 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
395 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
396 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
397 }
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
398
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
399 // 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
400 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
401 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
402 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
403 "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
404 "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
405 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
406 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
407 }
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
408
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
409 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
410 double time_slice = (double) GCPauseIntervalMillis / 1000.0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
411 _mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
412 _sigma = (double) G1ConfidencePercent / 100.0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
413
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
414 // start conservatively (around 50ms is about right)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
415 _concurrent_mark_remark_times_ms->add(0.05);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
416 _concurrent_mark_cleanup_times_ms->add(0.20);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
417 _tenuring_threshold = MaxTenuringThreshold;
3868
ae73da50be4b 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 3867
diff changeset
418 // _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
419 // update_young_list_target_length() during initialization.
3868
ae73da50be4b 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 3867
diff changeset
420 _max_survivor_regions = 0;
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
421
1356
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
422 assert(GCTimeRatio > 0,
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
423 "we should have set it to a default value set_g1_gc_flags() "
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
424 "if a user set it to 0");
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
425 _gc_overhead_perc = 100.0 * (1.0 / (1.0 + GCTimeRatio));
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
426
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
427 uintx reserve_perc = G1ReservePercent;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
428 // 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
429 if (reserve_perc > 50) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
430 reserve_perc = 50;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
431 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
432 "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
433 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
434 _reserve_factor = (double) reserve_perc / 100.0;
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
435 // 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
436 // 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
437 _reserve_regions = 0;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
438
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
439 initialize_all();
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
440 _collectionSetChooser = new CollectionSetChooser();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
441 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
442
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
443 // Increment "i", mod "len"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
444 static void inc_mod(int& i, int len) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
445 i++; if (i == len) i = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
446 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
447
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
448 void G1CollectorPolicy::initialize_flags() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
449 set_min_alignment(HeapRegion::GrainBytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
450 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
451 if (SurvivorRatio < 1) {
1e458753107d 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 545
diff changeset
452 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
453 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
454 CollectorPolicy::initialize_flags();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
455 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
456
1285
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
457 // 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
458 // 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
459 // 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
460 // 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
461 // 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
462 // 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
463 class G1YoungGenSizer : public TwoGenerationCollectorPolicy {
3976
d912b598c6c3 7091032: G1: assert failure when NewRatio is used
tonyp
parents: 3927
diff changeset
464 private:
d912b598c6c3 7091032: G1: assert failure when NewRatio is used
tonyp
parents: 3927
diff changeset
465 size_t size_to_region_num(size_t byte_size) {
d912b598c6c3 7091032: G1: assert failure when NewRatio is used
tonyp
parents: 3927
diff changeset
466 return MAX2((size_t) 1, byte_size / HeapRegion::GrainBytes);
d912b598c6c3 7091032: G1: assert failure when NewRatio is used
tonyp
parents: 3927
diff changeset
467 }
1285
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
468
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
469 public:
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
470 G1YoungGenSizer() {
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
471 initialize_flags();
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
472 initialize_size_info();
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
473 }
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
474 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
475 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
476 }
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
477 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
478 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
479 }
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
480 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
481 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
482 }
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
483 };
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
484
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
485 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
486 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
487 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
488 _min_desired_young_length = young_size;
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
489 _max_desired_young_length = young_size;
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
490 }
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
491
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
492 void G1CollectorPolicy::init() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
493 // Set aside an initial future to_space.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494 _g1 = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
495
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
496 assert(Heap_lock->owned_by_self(), "Locking discipline.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
497
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
498 initialize_gc_policy_counters();
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
499
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
500 G1YoungGenSizer sizer;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
501 size_t initial_region_num = sizer.initial_young_region_num();
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
502 _min_desired_young_length = sizer.min_young_region_num();
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
503 _max_desired_young_length = sizer.max_young_region_num();
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
504
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
505 if (FLAG_IS_CMDLINE(NewRatio)) {
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
506 if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
3976
d912b598c6c3 7091032: G1: assert failure when NewRatio is used
tonyp
parents: 3927
diff changeset
507 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
508 } else {
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
509 // 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
510 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
511 _using_new_ratio_calculations = true;
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
512 }
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
513 }
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
514
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
515 // GenCollectorPolicy guarantees that min <= initial <= max.
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
516 // Asserting here just to state that we rely on this property.
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
517 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
518 assert(initial_region_num <= _max_desired_young_length, "Initial young gen size too large");
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
519 assert(_min_desired_young_length <= initial_region_num, "Initial young gen size too small");
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
520
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
521 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
522 if (adaptive_young_list_length()) {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
523 _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
524 } else {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
525 _young_list_fixed_length = initial_region_num;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
526 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
527 _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
528 update_young_list_target_length();
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
529 _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
530
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
531 // 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
532 // 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
533 start_incremental_cset_building();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
534 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
535
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
536 // 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
537 void G1CollectorPolicy::initialize_gc_policy_counters() {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
538 _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 3);
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
539 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
540
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
541 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
542 double base_time_ms,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
543 size_t base_free_regions,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
544 double target_pause_time_ms) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
545 if (young_length >= base_free_regions) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
546 // end condition 1: not enough space for the young regions
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
547 return false;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
548 }
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 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
551 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
552 (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
553 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
554 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
555 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
556 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
557 // end condition 2: prediction is over the target pause time
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
558 return false;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
559 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
560
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
561 size_t free_bytes =
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
562 (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
563 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
564 // end condition 3: out-of-space (conservatively!)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
565 return false;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
566 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
567
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
568 // success!
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
569 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
570 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
571
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
572 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
573 // re-calculate the necessary reserve
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
574 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
575 // 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
576 // 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
577 _reserve_regions = (size_t) ceil(reserve_regions_d);
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
578
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
579 if (_using_new_ratio_calculations) {
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
580 // -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
581 // young gen length when the heap size has changed.
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
582 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
583 }
3919
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
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
586 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
587 size_t base_min_length) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
588 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
589 if (adaptive_young_list_length()) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
590 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
591 double now_sec = os::elapsedTime();
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
592 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
593 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
594 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
595 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
596 // 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
597 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
598 }
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
599 desired_min_length += base_min_length;
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
600 // 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
601 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
602 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
603
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
604 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
605 // 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
606 // 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
607 // effectively don't set this bound.
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
608 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
609 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
610
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
611 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
612 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
613 // 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
614 // otherwise, use the given value.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
615 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
616 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
617
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
618 // 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
619
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
620 // 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
621 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
622 // 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
623 // 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
624 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
625 size_t desired_min_length =
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
626 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
627 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
628 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
629 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
630
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
631 // 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
632
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
633 // 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
634 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
635 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
636 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
637 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
638 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
639 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
640 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
641 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
642
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
643 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
644 if (adaptive_young_list_length()) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
645 if (full_young_gcs()) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
646 young_list_target_length =
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
647 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
648 base_min_length,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
649 desired_min_length,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
650 desired_max_length);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
651 _rs_lengths_prediction = rs_lengths;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
652 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
653 // 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
654 // 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
655 // 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
656 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
657 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
658 if (full_young_gcs()) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
659 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
660 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
661 // A bit arbitrary: during partially-young GCs we allocate half
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
662 // 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
663 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
664 // 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
665 // 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
666 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
667 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
668 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
669
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
670 // 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
671 // 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
672 // 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
673 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
674 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
675 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
676 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
677 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
678 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
679
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
680 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
681 "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
682 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
683 _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
684
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
685 update_max_gc_locker_expansion();
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
686 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
687
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
688 size_t
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
689 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
690 size_t base_min_length,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
691 size_t desired_min_length,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
692 size_t desired_max_length) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
693 assert(adaptive_young_list_length(), "pre-condition");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
694 assert(full_young_gcs(), "only call this for fully-young GCs");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
695
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
696 // 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
697 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
698 return desired_min_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
699 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
700
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
701 // 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
702 // 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
703 // 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
704 // 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
705 // survivor_regions_evac_time prediction.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
706 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
707 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
708 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
709 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
710
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
711 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
712 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
713 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
714 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
715 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
716 double base_time_ms =
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
717 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
718 survivor_regions_evac_time;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
719 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
720 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
721 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
722 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
723 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
724
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
725 // 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
726 // 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
727
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
728 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
729 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
730 // 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
731 // 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
732 // 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
733 // 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
734 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
735 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
736 // 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
737 // 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
738 // 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
739 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
740 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
741 // 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
742 // 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
743 // length. The loop invariants are:
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
744 //
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
745 // 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
746 // 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
747 // 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
748 //
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
749 // 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
750 // 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
751 // 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
752 // 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
753 // 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
754 // 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
755
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
756 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
757 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
758 while (diff > 0) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
759 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
760 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
761 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
762 min_young_length = young_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
763 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
764 max_young_length = young_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
765 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
766 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
767 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
768 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
769 // 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
770 // 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
771
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
772 // 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
773 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
774 "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
775 "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
776 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
777 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
778 "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
779 "fit into the pause target");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
780 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
781 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
782 "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
783 "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
784 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
785 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
786 // 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
787 // 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
788 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
789 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
790 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
791
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
792 double G1CollectorPolicy::predict_survivor_regions_evac_time() {
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
793 double survivor_regions_evac_time = 0.0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
794 for (HeapRegion * r = _recorded_survivor_head;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
795 r != NULL && r != _recorded_survivor_tail->get_next_young_region();
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
796 r = r->get_next_young_region()) {
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
797 survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
798 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
799 return survivor_regions_evac_time;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
800 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
801
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
802 void G1CollectorPolicy::revise_young_list_target_length_if_necessary() {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
803 guarantee( adaptive_young_list_length(), "should not call this otherwise" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
804
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
805 size_t rs_lengths = _g1->young_list()->sampled_rs_lengths();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
806 if (rs_lengths > _rs_lengths_prediction) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
807 // add 10% to avoid having to recalculate often
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
808 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
809 update_young_list_target_length(rs_lengths_prediction);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
810 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
811 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
812
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
813
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
814
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
815 HeapWord* G1CollectorPolicy::mem_allocate_work(size_t size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
816 bool is_tlab,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
817 bool* gc_overhead_limit_was_exceeded) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
818 guarantee(false, "Not using this policy feature yet.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
819 return NULL;
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 // This method controls how a collector handles one or more
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
823 // of its generations being fully allocated.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
824 HeapWord* G1CollectorPolicy::satisfy_failed_allocation(size_t size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
825 bool is_tlab) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
826 guarantee(false, "Not using this policy feature yet.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
827 return NULL;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
831 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
832 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
833 HeapRegion* head = _g1->young_list()->first_region();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
834 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
835 verify_young_ages(head, _short_lived_surv_rate_group);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
836 // also call verify_young_ages on any additional surv rate groups
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 bool
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
840 G1CollectorPolicy::verify_young_ages(HeapRegion* head,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
841 SurvRateGroup *surv_rate_group) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
842 guarantee( surv_rate_group != NULL, "pre-condition" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
843
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
844 const char* name = surv_rate_group->name();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
845 bool ret = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
846 int prev_age = -1;
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 for (HeapRegion* curr = head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
849 curr != NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
850 curr = curr->get_next_young_region()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
851 SurvRateGroup* group = curr->surv_rate_group();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
852 if (group == NULL && !curr->is_survivor()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
853 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
854 ret = false;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
857 if (surv_rate_group == group) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
858 int age = curr->age_in_surv_rate_group();
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 if (age < 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
861 gclog_or_tty->print_cr("## %s: encountered negative age", name);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
862 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
863 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
864
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
865 if (age <= prev_age) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
866 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
867 "(%d, %d)", name, age, prev_age);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
868 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
869 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
870 prev_age = age;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
871 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
872 }
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 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
875 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
876 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
877
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
878 void G1CollectorPolicy::record_full_collection_start() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
879 _cur_collection_start_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
880 // 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
881 _g1->set_full_collection();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
882 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
883
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
884 void G1CollectorPolicy::record_full_collection_end() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
885 // Consider this like a collection pause for the purposes of allocation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
886 // since last pause.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
887 double end_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
888 double full_gc_time_sec = end_sec - _cur_collection_start_sec;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
889 double full_gc_time_ms = full_gc_time_sec * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
890
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
891 _all_full_gc_times_ms->add(full_gc_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
892
595
3698e8f47799 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 547
diff changeset
893 update_recent_gc_times(end_sec, full_gc_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
894
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
895 _g1->clear_full_collection();
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 // "Nuke" the heuristics that control the fully/partially young GC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
898 // transitions and make sure we start with fully young GCs after the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
899 // Full GC.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
900 set_full_young_gcs(true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
901 _last_full_young_gc = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
902 _should_revert_to_full_young_gcs = false;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
903 clear_initiate_conc_mark_if_possible();
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
904 clear_during_initial_mark_pause();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
905 _known_garbage_bytes = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
906 _known_garbage_ratio = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
907 _in_marking_window = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
908 _in_marking_window_im = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
909
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
910 _short_lived_surv_rate_group->start_adding_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
911 // also call this on any additional surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
912
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
913 record_survivor_regions(0, NULL, NULL);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
914
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
915 _prev_region_num_young = _region_num_young;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
916 _prev_region_num_tenured = _region_num_tenured;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
917
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
918 _free_regions_at_end_of_collection = _g1->free_regions();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
919 // Reset survivors SurvRateGroup.
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
920 _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
921 update_young_list_target_length();
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
922 _collectionSetChooser->updateAfterFullCollection();
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
923 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
924
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
925 void G1CollectorPolicy::record_stop_world_start() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
926 _stop_world_start = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
927 }
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 void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
930 size_t start_used) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
931 if (PrintGCDetails) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
932 gclog_or_tty->stamp(PrintGCTimeStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
933 gclog_or_tty->print("[GC pause");
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
934 gclog_or_tty->print(" (%s)", full_young_gcs() ? "young" : "partial");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
935 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
936
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
937 // 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
938 // 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
939 // 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
940 update_survivors_policy();
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
941
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
942 assert(_g1->used() == _g1->recalculate_used(),
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
943 err_msg("sanity, used: "SIZE_FORMAT" recalculate_used: "SIZE_FORMAT,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
944 _g1->used(), _g1->recalculate_used()));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
945
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
946 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
947 _all_stop_world_times_ms->add(s_w_t_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
948 _stop_world_start = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
949
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
950 _cur_collection_start_sec = start_time_sec;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
951 _cur_collection_pause_used_at_start_bytes = start_used;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
952 _cur_collection_pause_used_regions_at_start = _g1->used_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
953 _pending_cards = _g1->pending_card_num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
954 _max_pending_cards = _g1->max_pending_card_num();
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 _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
957 _bytes_copied_during_gc = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
958
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
959 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
960 _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
961 _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
962 _capacity_before_gc = _g1->capacity();
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
963
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
964 #ifdef DEBUG
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
965 // initialise these to something well known so that we can spot
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
966 // if they are not set properly
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
967
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
968 for (int i = 0; i < _parallel_gc_threads; ++i) {
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
969 _par_last_gc_worker_start_times_ms[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
970 _par_last_ext_root_scan_times_ms[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
971 _par_last_mark_stack_scan_times_ms[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
972 _par_last_update_rs_times_ms[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
973 _par_last_update_rs_processed_buffers[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
974 _par_last_scan_rs_times_ms[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
975 _par_last_obj_copy_times_ms[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
976 _par_last_termination_times_ms[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
977 _par_last_termination_attempts[i] = -1234.0;
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
978 _par_last_gc_worker_end_times_ms[i] = -1234.0;
2430
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
979 _par_last_gc_worker_times_ms[i] = -1234.0;
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
980 _par_last_gc_worker_other_times_ms[i] = -1234.0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
981 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
982 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
983
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
984 for (int i = 0; i < _aux_num; ++i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985 _cur_aux_times_ms[i] = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986 _cur_aux_times_set[i] = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
987 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
988
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
989 // These are initialized to zero here and they are set during
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
990 // the evacuation pause if marking is in progress.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
991 _cur_satb_drain_time_ms = 0.0;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
992 _last_satb_drain_processed_buffers = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
994 _last_young_gc_full = false;
342
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 // do that for any other surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
997 _short_lived_surv_rate_group->stop_adding_regions();
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1261
diff changeset
998 _survivors_age_table.clear();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
999
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1000 assert( verify_young_ages(), "region age verification" );
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_mark_closure_time(double mark_closure_time_ms) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1004 _mark_closure_time_ms = mark_closure_time_ms;
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
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1007 void G1CollectorPolicy::record_concurrent_mark_init_end(double
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1008 mark_init_elapsed_time_ms) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1009 _during_marking = true;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1010 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
1011 clear_during_initial_mark_pause();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1012 _cur_mark_stop_world_time_ms = mark_init_elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1013 }
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 void G1CollectorPolicy::record_concurrent_mark_remark_start() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1016 _mark_remark_start_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1017 _during_marking = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1018 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1019
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1020 void G1CollectorPolicy::record_concurrent_mark_remark_end() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1021 double end_time_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1022 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
1023 _concurrent_mark_remark_times_ms->add(elapsed_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1024 _cur_mark_stop_world_time_ms += elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1025 _prev_collection_pause_end_ms += elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1026
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1027 _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
1028 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1029
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1030 void G1CollectorPolicy::record_concurrent_mark_cleanup_start() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1031 _mark_cleanup_start_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1032 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1033
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1034 void G1CollectorPolicy::record_concurrent_mark_cleanup_completed() {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1035 _should_revert_to_full_young_gcs = false;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1036 _last_full_young_gc = true;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1037 _in_marking_window = false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1038 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1039
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1040 void G1CollectorPolicy::record_concurrent_pause() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1041 if (_stop_world_start > 0.0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1042 double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1043 _all_yield_times_ms->add(yield_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1044 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1045 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1046
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1047 void G1CollectorPolicy::record_concurrent_pause_end() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1048 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1049
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1050 template<class T>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1051 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
1052 T sum = (T)0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1053 for (int i = 0; i < n; i++) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1054 int j = (start + i) % N;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1055 sum += sum_arr[j];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1056 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1057 return sum;
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
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
1060 void G1CollectorPolicy::print_par_stats(int level,
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
1061 const char* str,
2430
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1062 double* data) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1063 double min = data[0], max = data[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1064 double total = 0.0;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1065 LineBuffer buf(level);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1066 buf.append("[%s (ms):", str);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1067 for (uint i = 0; i < ParallelGCThreads; ++i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1068 double val = data[i];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1069 if (val < min)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1070 min = val;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1071 if (val > max)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1072 max = val;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1073 total += val;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1074 buf.append(" %3.1lf", val);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1075 }
2430
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1076 buf.append_and_print_cr("");
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1077 double avg = total / (double) ParallelGCThreads;
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1078 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
1079 avg, min, max, max - min);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1080 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1081
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
1082 void G1CollectorPolicy::print_par_sizes(int level,
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1610
diff changeset
1083 const char* str,
2430
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1084 double* data) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1085 double min = data[0], max = data[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1086 double total = 0.0;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1087 LineBuffer buf(level);
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1088 buf.append("[%s :", str);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1089 for (uint i = 0; i < ParallelGCThreads; ++i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1090 double val = data[i];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1091 if (val < min)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1092 min = val;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1093 if (val > max)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1094 max = val;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1095 total += val;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1096 buf.append(" %d", (int) val);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1097 }
2430
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1098 buf.append_and_print_cr("");
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1099 double avg = total / (double) ParallelGCThreads;
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1100 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
1101 (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
1102 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1103
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1104 void G1CollectorPolicy::print_stats(int level,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1105 const char* str,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1106 double value) {
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1107 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
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 void G1CollectorPolicy::print_stats(int level,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1111 const char* str,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1112 int value) {
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
1113 LineBuffer(level).append_and_print_cr("[%s: %d]", str, value);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1114 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1115
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1116 double G1CollectorPolicy::avg_value(double* data) {
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
1117 if (G1CollectedHeap::use_parallel_gc_threads()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1118 double ret = 0.0;
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1119 for (uint i = 0; i < ParallelGCThreads; ++i) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1120 ret += data[i];
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1121 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1122 return ret / (double) ParallelGCThreads;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1123 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1124 return data[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1125 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1126 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1127
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1128 double G1CollectorPolicy::max_value(double* data) {
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
1129 if (G1CollectedHeap::use_parallel_gc_threads()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1130 double ret = data[0];
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1131 for (uint i = 1; i < ParallelGCThreads; ++i) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1132 if (data[i] > ret) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1133 ret = data[i];
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1134 }
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1135 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1136 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1137 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1138 return data[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1139 }
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
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1142 double G1CollectorPolicy::sum_of_values(double* data) {
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
1143 if (G1CollectedHeap::use_parallel_gc_threads()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1144 double sum = 0.0;
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1145 for (uint i = 0; i < ParallelGCThreads; i++) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1146 sum += data[i];
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1147 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1148 return sum;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1149 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1150 return data[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1151 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1152 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1153
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1154 double G1CollectorPolicy::max_sum(double* data1, double* data2) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1155 double ret = data1[0] + data2[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1156
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
1157 if (G1CollectedHeap::use_parallel_gc_threads()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1158 for (uint i = 1; i < ParallelGCThreads; ++i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1159 double data = data1[i] + data2[i];
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1160 if (data > ret) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1161 ret = data;
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1162 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1163 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1164 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1165 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1166 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1167
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1168 // Anything below that is considered to be zero
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1169 #define MIN_TIMER_GRANULARITY 0.0000001
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1170
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1171 void G1CollectorPolicy::record_collection_pause_end() {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1172 double end_time_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1173 double elapsed_ms = _last_pause_time_ms;
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
1174 bool parallel = G1CollectedHeap::use_parallel_gc_threads();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1175 size_t rs_size =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1176 _cur_collection_pause_used_regions_at_start - collection_set_size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1177 size_t cur_used_bytes = _g1->used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1178 assert(cur_used_bytes == _g1->recalculate_used(), "It should!");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1179 bool last_pause_included_initial_mark = false;
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1180 bool update_stats = !_g1->evacuation_failed();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1181
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1182 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1183 if (G1YoungSurvRateVerbose) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1184 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1185 _short_lived_surv_rate_group->print();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1186 // do that for any other surv rate groups too
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1187 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1188 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1189
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1190 last_pause_included_initial_mark = during_initial_mark_pause();
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1191 if (last_pause_included_initial_mark)
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1192 record_concurrent_mark_init_end(0.0);
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1193
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1194 size_t marking_initiating_used_threshold =
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1195 (_g1->capacity() / 100) * InitiatingHeapOccupancyPercent;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1196
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1197 if (!_g1->mark_in_progress() && !_last_full_young_gc) {
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1198 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
1199 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
1200 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
1201 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
1202
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1203 ergo_verbose3(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1204 "request concurrent cycle initiation",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1205 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
1206 ergo_format_byte("occupancy")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1207 ergo_format_byte_perc("threshold"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1208 cur_used_bytes,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1209 marking_initiating_used_threshold,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1210 (double) InitiatingHeapOccupancyPercent);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1211
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1212 // 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
1213 // 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
1214 // 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
1215 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
1216 } else {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1217 ergo_verbose2(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1218 "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
1219 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
1220 ergo_format_byte("occupancy")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1221 ergo_format_byte("previous occupancy"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1222 cur_used_bytes,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1223 _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
1224 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1225 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1226 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1227
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1228 _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
1229
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1230 _mmu_tracker->add_pause(end_time_sec - elapsed_ms/1000.0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1231 end_time_sec, false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1232
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1233 guarantee(_cur_collection_pause_used_regions_at_start >=
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1234 collection_set_size(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1235 "Negative RS size?");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1236
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1237 // This assert is exempted when we're doing parallel collection pauses,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1238 // because the fragmentation caused by the parallel GC allocation buffers
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1239 // 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
1240 // before. Best leave this out until the fragmentation problem is fixed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1241 // Pauses in which evacuation failed can also lead to negative
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1242 // collections, since no space is reclaimed from a region containing an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1243 // object whose evacuation failed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1244 // 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
1245 // 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
1246 // (DLD, 10/05.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1247 assert((true || parallel) // Always using GC LABs now.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1248 || _g1->evacuation_failed()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1249 || _cur_collection_pause_used_at_start_bytes >= cur_used_bytes,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1250 "Negative collection");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1251
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1252 size_t freed_bytes =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1253 _cur_collection_pause_used_at_start_bytes - cur_used_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1254 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
1255
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1256 double survival_fraction =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1257 (double)surviving_bytes/
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1258 (double)_collection_set_bytes_used_before;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1259
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1260 _n_pauses++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1261
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1262 // These values are used to update the summary information that is
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1263 // displayed when TraceGen0Time is enabled, and are output as part
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1264 // of the PrintGCDetails output, in the non-parallel case.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1265
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
1266 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
1267 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
1268 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
1269 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
1270 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
1271 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
1272 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
1273 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
1274
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1275 double known_time = ext_root_scan_time +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1276 mark_stack_scan_time +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1277 update_rs_time +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1278 scan_rs_time +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1279 obj_copy_time;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1280
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1281 double other_time_ms = elapsed_ms;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1282
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1283 // Subtract the SATB drain time. It's initialized to zero at the
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1284 // start of the pause and is updated during the pause if marking
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1285 // is in progress.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1286 other_time_ms -= _cur_satb_drain_time_ms;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1287
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1288 if (parallel) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1289 other_time_ms -= _cur_collection_par_time_ms;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1290 } else {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1291 other_time_ms -= known_time;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1292 }
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1293
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1294 // Subtract the time taken to clean the card table from the
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1295 // current value of "other time"
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1296 other_time_ms -= _cur_clear_ct_time_ms;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1297
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1298 // TraceGen0Time and TraceGen1Time summary info updating.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1299 _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
1300
595
3698e8f47799 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 547
diff changeset
1301 if (update_stats) {
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
1302 _recent_rs_scan_times_ms->add(scan_rs_time);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1303 _recent_pause_times_ms->add(elapsed_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1304 _recent_rs_sizes->add(rs_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1305
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1306 _summary->record_total_time_ms(elapsed_ms);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1307 _summary->record_other_time_ms(other_time_ms);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1308
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1309 MainBodySummary* body_summary = _summary->main_body_summary();
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1310 assert(body_summary != NULL, "should not be null!");
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1311
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1312 // This will be non-zero iff marking is currently in progress (i.e.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1313 // _g1->mark_in_progress() == true) and the currrent pause was not
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1314 // an initial mark pause. Since the body_summary items are NumberSeqs,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1315 // however, they have to be consistent and updated in lock-step with
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1316 // each other. Therefore we unconditionally record the SATB drain
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1317 // time - even if it's zero.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1318 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
1319
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
1320 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
1321 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
1322 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
1323 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
1324 body_summary->record_obj_copy_time_ms(obj_copy_time);
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1325
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
1326 if (parallel) {
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
1327 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
1328 body_summary->record_termination_time_ms(termination_time);
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1329
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1330 double parallel_known_time = known_time + termination_time;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1331 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
1332 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
1333 }
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1334
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
1335 body_summary->record_mark_closure_time_ms(_mark_closure_time_ms);
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1336 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
1337
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1338 // We exempt parallel collection from this check because Alloc Buffer
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1339 // fragmentation can produce negative collections. Same with evac
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1340 // failure.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1341 // 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
1342 // 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
1343 // (DLD, 10/05.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1344 assert((true || parallel)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1345 || _g1->evacuation_failed()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1346 || surviving_bytes <= _collection_set_bytes_used_before,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1347 "Or else negative collection!");
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1348
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1349 _recent_CS_bytes_used_before->add(_collection_set_bytes_used_before);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1350 _recent_CS_bytes_surviving->add(surviving_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1351
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1352 // this is where we update the allocation rate of the application
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1353 double app_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1354 (_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1355 if (app_time_ms < MIN_TIMER_GRANULARITY) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1356 // This usually happens due to the timer not having the required
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1357 // granularity. Some Linuxes are the usual culprits.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1358 // We'll just set it to something (arbitrarily) small.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1359 app_time_ms = 1.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1360 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1361 size_t regions_allocated =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1362 (_region_num_young - _prev_region_num_young) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1363 (_region_num_tenured - _prev_region_num_tenured);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1364 double alloc_rate_ms = (double) regions_allocated / app_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1365 _alloc_rate_ms_seq->add(alloc_rate_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1366 _prev_region_num_young = _region_num_young;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1367 _prev_region_num_tenured = _region_num_tenured;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1368
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1369 double interval_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1370 (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
1371 update_recent_gc_times(end_time_sec, elapsed_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1372 _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
1373 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
1374 (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
1375 #ifndef PRODUCT
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1376 // 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
1377 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
1378 gclog_or_tty->print_cr("-------------------------------------------");
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1379 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
1380 _recent_gc_times_ms->dump();
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1381 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
1382 _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
1383 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
1384 _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
1385 // 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
1386 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
1387 #endif // !PRODUCT
23b9a8d315fc 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 1086
diff changeset
1388 // 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
1389 // 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
1390 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
1391 _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
1392 } else {
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1393 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
1394 _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
1395 }
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1396 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1397 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1398
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1399 for (int i = 0; i < _aux_num; ++i) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1400 if (_cur_aux_times_set[i]) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1401 _all_aux_times_ms[i].add(_cur_aux_times_ms[i]);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1402 }
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1403 }
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1404
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1405
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1406 if (G1PolicyVerbose > 1) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1407 gclog_or_tty->print_cr(" Recording collection pause(%d)", _n_pauses);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1408 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1409
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1410 if (G1PolicyVerbose > 1) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1411 gclog_or_tty->print_cr(" ET: %10.6f ms (avg: %10.6f ms)\n"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1412 " ET-RS: %10.6f ms (avg: %10.6f ms)\n"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1413 " |RS|: " SIZE_FORMAT,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1414 elapsed_ms, recent_avg_time_for_pauses_ms(),
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
1415 scan_rs_time, recent_avg_time_for_rs_scan_ms(),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1416 rs_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1417
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1418 gclog_or_tty->print_cr(" Used at start: " SIZE_FORMAT"K"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1419 " At end " SIZE_FORMAT "K\n"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1420 " garbage : " SIZE_FORMAT "K"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1421 " of " SIZE_FORMAT "K\n"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1422 " survival : %6.2f%% (%6.2f%% avg)",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1423 _cur_collection_pause_used_at_start_bytes/K,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1424 _g1->used()/K, freed_bytes/K,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1425 _collection_set_bytes_used_before/K,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1426 survival_fraction*100.0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1427 recent_avg_survival_fraction()*100.0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1428 gclog_or_tty->print_cr(" Recent %% gc pause time: %6.2f",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1429 recent_avg_pause_time_ratio() * 100.0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1430 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1431
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1432 // PrintGCDetails output
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1433 if (PrintGCDetails) {
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1434 bool print_marking_info =
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1435 _g1->mark_in_progress() && !last_pause_included_initial_mark;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1436
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1437 gclog_or_tty->print_cr("%s, %1.8lf secs]",
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1438 (last_pause_included_initial_mark) ? " (initial-mark)" : "",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1439 elapsed_ms / 1000.0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1440
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1441 if (print_marking_info) {
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1442 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
1443 print_stats(2, "Processed Buffers", _last_satb_drain_processed_buffers);
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1444 }
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1445
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1446 if (parallel) {
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1447 print_stats(1, "Parallel Time", _cur_collection_par_time_ms);
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1448 print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1449 print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1450 if (print_marking_info) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1451 print_par_stats(2, "Mark Stack Scanning", _par_last_mark_stack_scan_times_ms);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1452 }
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1453 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
1454 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
1455 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
1456 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
1457 print_par_stats(2, "Termination", _par_last_termination_times_ms);
2430
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1458 print_par_sizes(3, "Termination Attempts", _par_last_termination_attempts);
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1459 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
1460
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1461 for (int i = 0; i < _parallel_gc_threads; i++) {
5c0b591e1074 6948149: G1: Imbalance in termination times
brutisso
parents: 2363
diff changeset
1462 _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
1463
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1464 double worker_known_time = _par_last_ext_root_scan_times_ms[i] +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1465 _par_last_mark_stack_scan_times_ms[i] +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1466 _par_last_update_rs_times_ms[i] +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1467 _par_last_scan_rs_times_ms[i] +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1468 _par_last_obj_copy_times_ms[i] +
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1469 _par_last_termination_times_ms[i];
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1470
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1471 _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
1472 }
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1473 print_par_stats(2, "GC Worker", _par_last_gc_worker_times_ms);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1474 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
1475 } else {
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1476 print_stats(1, "Ext Root Scanning", ext_root_scan_time);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1477 if (print_marking_info) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1478 print_stats(1, "Mark Stack Scanning", mark_stack_scan_time);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1479 }
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1480 print_stats(1, "Update RS", update_rs_time);
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1481 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
1482 print_stats(1, "Scan RS", scan_rs_time);
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
1483 print_stats(1, "Object Copying", obj_copy_time);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1484 }
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
1485 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
1486 #ifndef PRODUCT
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
1487 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
1488 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
1489 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
1490 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
1491 if (_num_cc_clears > 0) {
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
1492 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
1493 }
6cb8e9df7174 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 845
diff changeset
1494 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1495 print_stats(1, "Other", other_time_ms);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1496 print_stats(2, "Choose CSet", _recorded_young_cset_choice_time_ms);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3976
diff changeset
1497 print_stats(2, "Ref Proc", _cur_ref_proc_time_ms);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3976
diff changeset
1498 print_stats(2, "Ref Enq", _cur_ref_enq_time_ms);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1499
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1500 for (int i = 0; i < _aux_num; ++i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1501 if (_cur_aux_times_set[i]) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1502 char buffer[96];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1503 sprintf(buffer, "Aux%d", i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1504 print_stats(1, buffer, _cur_aux_times_ms[i]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1505 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1506 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1507 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1508
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1509 // Update the efficiency-since-mark vars.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1510 double proc_ms = elapsed_ms * (double) _parallel_gc_threads;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1511 if (elapsed_ms < MIN_TIMER_GRANULARITY) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1512 // This usually happens due to the timer not having the required
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1513 // granularity. Some Linuxes are the usual culprits.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1514 // We'll just set it to something (arbitrarily) small.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1515 proc_ms = 1.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1516 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1517 double cur_efficiency = (double) freed_bytes / proc_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1518
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1519 bool new_in_marking_window = _in_marking_window;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1520 bool new_in_marking_window_im = false;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1521 if (during_initial_mark_pause()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1522 new_in_marking_window = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1523 new_in_marking_window_im = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1524 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1525
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1526 if (_last_full_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
1527 if (!last_pause_included_initial_mark) {
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1528 ergo_verbose2(ErgoPartiallyYoungGCs,
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1529 "start partially-young GCs",
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1530 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
1531 _known_garbage_bytes, _known_garbage_ratio * 100.0);
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1532 set_full_young_gcs(false);
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1533 } else {
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1534 ergo_verbose0(ErgoPartiallyYoungGCs,
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1535 "do not start partially-young GCs",
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1536 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
1537 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1538 _last_full_young_gc = false;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1539 }
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1540
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1541 if ( !_last_young_gc_full ) {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1542 if (_should_revert_to_full_young_gcs) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1543 ergo_verbose2(ErgoPartiallyYoungGCs,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1544 "end partially-young GCs",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1545 ergo_format_reason("partially-young GCs end requested")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1546 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
1547 _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
1548 set_full_young_gcs(true);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1549 } else if (_known_garbage_ratio < 0.05) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1550 ergo_verbose3(ErgoPartiallyYoungGCs,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1551 "end partially-young GCs",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1552 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
1553 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
1554 ergo_format_perc("threshold"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1555 _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
1556 0.05 * 100.0);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1557 set_full_young_gcs(true);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1558 } 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
1559 (get_gc_eff_factor() * cur_efficiency < predict_young_gc_eff())) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1560 ergo_verbose5(ErgoPartiallyYoungGCs,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1561 "end partially-young GCs",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1562 ergo_format_reason("current GC efficiency lower than "
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1563 "predicted fully-young GC efficiency")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1564 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
1565 ergo_format_double("current GC efficiency")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1566 ergo_format_double("predicted fully-young GC efficiency")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1567 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
1568 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
1569 predict_young_gc_eff(),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1570 _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
1571 set_full_young_gcs(true);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1572 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1573 }
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1574 _should_revert_to_full_young_gcs = false;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1575
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1576 if (_last_young_gc_full && !_during_marking) {
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1577 _young_gc_eff_seq->add(cur_efficiency);
342
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1580 _short_lived_surv_rate_group->start_adding_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1581 // do that for any other surv rate groupsx
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1582
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1583 // <NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1584
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
1585 if (update_stats) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1586 double pause_time_ms = elapsed_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1587
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1588 size_t diff = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1589 if (_max_pending_cards >= _pending_cards)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1590 diff = _max_pending_cards - _pending_cards;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1591 _pending_card_diff_seq->add((double) diff);
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 double cost_per_card_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1594 if (_pending_cards > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1595 cost_per_card_ms = update_rs_time / (double) _pending_cards;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1596 _cost_per_card_ms_seq->add(cost_per_card_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1597 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1598
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1599 size_t cards_scanned = _g1->cards_scanned();
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 cost_per_entry_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1602 if (cards_scanned > 10) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1603 cost_per_entry_ms = scan_rs_time / (double) cards_scanned;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1604 if (_last_young_gc_full)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1605 _cost_per_entry_ms_seq->add(cost_per_entry_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1606 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1607 _partially_young_cost_per_entry_ms_seq->add(cost_per_entry_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1608 }
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 if (_max_rs_lengths > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1611 double cards_per_entry_ratio =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1612 (double) cards_scanned / (double) _max_rs_lengths;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1613 if (_last_young_gc_full)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1614 _fully_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1615 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1616 _partially_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1617 }
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 size_t rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1620 if (rs_length_diff >= 0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1621 _rs_length_diff_seq->add((double) rs_length_diff);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1622
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1623 size_t copied_bytes = surviving_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1624 double cost_per_byte_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1625 if (copied_bytes > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1626 cost_per_byte_ms = obj_copy_time / (double) copied_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1627 if (_in_marking_window)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1628 _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1629 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1630 _cost_per_byte_ms_seq->add(cost_per_byte_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1631 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1632
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1633 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
1634 (update_rs_time + scan_rs_time + obj_copy_time +
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1635 _mark_closure_time_ms + termination_time);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1636
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1637 double young_other_time_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1638 if (_recorded_young_regions > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1639 young_other_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1640 _recorded_young_cset_choice_time_ms +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1641 _recorded_young_free_cset_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1642 _young_other_cost_per_region_ms_seq->add(young_other_time_ms /
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1643 (double) _recorded_young_regions);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1644 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1645 double non_young_other_time_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1646 if (_recorded_non_young_regions > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1647 non_young_other_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1648 _recorded_non_young_cset_choice_time_ms +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1649 _recorded_non_young_free_cset_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1650
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1651 _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms /
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1652 (double) _recorded_non_young_regions);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1653 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1654
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1655 double constant_other_time_ms = all_other_time_ms -
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1656 (young_other_time_ms + non_young_other_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1657 _constant_other_time_ms_seq->add(constant_other_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1658
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1659 double survival_ratio = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1660 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
1661 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
1662 (double) _bytes_in_collection_set_before_gc;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1663 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1664
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1665 _pending_cards_seq->add((double) _pending_cards);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1666 _scanned_cards_seq->add((double) cards_scanned);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1667 _rs_lengths_seq->add((double) _max_rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1668
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1669 double expensive_region_limit_ms =
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
1670 (double) MaxGCPauseMillis - predict_constant_other_time_ms();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1671 if (expensive_region_limit_ms < 0.0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1672 // 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
1673 // than the max pause time
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
1674 expensive_region_limit_ms = (double) MaxGCPauseMillis;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1675 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1676 _expensive_region_limit_ms = expensive_region_limit_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1677
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1678 if (PREDICTIONS_VERBOSE) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1679 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1680 gclog_or_tty->print_cr("PREDICTIONS %1.4lf %d "
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1681 "REGIONS %d %d %d "
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1682 "PENDING_CARDS %d %d "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1683 "CARDS_SCANNED %d %d "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1684 "RS_LENGTHS %d %d "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1685 "RS_UPDATE %1.6lf %1.6lf RS_SCAN %1.6lf %1.6lf "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1686 "SURVIVAL_RATIO %1.6lf %1.6lf "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1687 "OBJECT_COPY %1.6lf %1.6lf OTHER_CONSTANT %1.6lf %1.6lf "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1688 "OTHER_YOUNG %1.6lf %1.6lf "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1689 "OTHER_NON_YOUNG %1.6lf %1.6lf "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1690 "VTIME_DIFF %1.6lf TERMINATION %1.6lf "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1691 "ELAPSED %1.6lf %1.6lf ",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1692 _cur_collection_start_sec,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1693 (!_last_young_gc_full) ? 2 :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1694 (last_pause_included_initial_mark) ? 1 : 0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1695 _recorded_region_num,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1696 _recorded_young_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1697 _recorded_non_young_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1698 _predicted_pending_cards, _pending_cards,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1699 _predicted_cards_scanned, cards_scanned,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1700 _predicted_rs_lengths, _max_rs_lengths,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1701 _predicted_rs_update_time_ms, update_rs_time,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1702 _predicted_rs_scan_time_ms, scan_rs_time,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1703 _predicted_survival_ratio, survival_ratio,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1704 _predicted_object_copy_time_ms, obj_copy_time,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1705 _predicted_constant_other_time_ms, constant_other_time_ms,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1706 _predicted_young_other_time_ms, young_other_time_ms,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1707 _predicted_non_young_other_time_ms,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1708 non_young_other_time_ms,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1709 _vtime_diff_ms, termination_time,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1710 _predicted_pause_time_ms, elapsed_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1711 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1712
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1713 if (G1PolicyVerbose > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1714 gclog_or_tty->print_cr("Pause Time, predicted: %1.4lfms (predicted %s), actual: %1.4lfms",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1715 _predicted_pause_time_ms,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1716 (_within_target) ? "within" : "outside",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1717 elapsed_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1718 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1719
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1720 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1721
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1722 _in_marking_window = new_in_marking_window;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1723 _in_marking_window_im = new_in_marking_window_im;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1724 _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
1725 update_young_list_target_length();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1726
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1727 // 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
1728 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
1729 adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1730 // </NEW PREDICTION>
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1731
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1732 assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end.");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1733 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1734
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1735 #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
1736 #define EXT_SIZE_PARAMS(bytes) \
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1737 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
1738 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
1739
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1740 void G1CollectorPolicy::print_heap_transition() {
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1741 if (PrintGCDetails) {
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1742 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
1743 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
1744 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
1745 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
1746 size_t used = _g1->used();
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1747 size_t capacity = _g1->capacity();
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1748 size_t eden_capacity =
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1749 (_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
1750
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1751 gclog_or_tty->print_cr(
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1752 " [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
1753 "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" "
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1754 "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1755 EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]",
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1756 EXT_SIZE_PARAMS(_eden_bytes_before_gc),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1757 EXT_SIZE_PARAMS(_prev_eden_capacity),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1758 EXT_SIZE_PARAMS(eden_bytes),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1759 EXT_SIZE_PARAMS(eden_capacity),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1760 EXT_SIZE_PARAMS(_survivor_bytes_before_gc),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1761 EXT_SIZE_PARAMS(survivor_bytes),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1762 EXT_SIZE_PARAMS(used_before_gc),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1763 EXT_SIZE_PARAMS(_capacity_before_gc),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1764 EXT_SIZE_PARAMS(used),
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1765 EXT_SIZE_PARAMS(capacity));
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1766
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
1767 _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
1768 } else if (PrintGC) {
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1769 _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
1770 _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
1771 _g1->used(), _g1->capacity());
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1772 }
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1773 }
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1774
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1775 // <NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1776
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1777 void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1778 double update_rs_processed_buffers,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1779 double goal_ms) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1780 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1781 ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1782
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1261
diff changeset
1783 if (G1UseAdaptiveConcRefinement) {
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1784 const int k_gy = 3, k_gr = 6;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1785 const double inc_k = 1.1, dec_k = 0.9;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1786
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1787 int g = cg1r->green_zone();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1788 if (update_rs_time > goal_ms) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1789 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
1790 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1791 if (update_rs_time < goal_ms && update_rs_processed_buffers > g) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1792 g = (int)MAX2(g * inc_k, g + 1.0);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1793 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1794 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1795 // Change the refinement threads params
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1796 cg1r->set_green_zone(g);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1797 cg1r->set_yellow_zone(g * k_gy);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1798 cg1r->set_red_zone(g * k_gr);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1799 cg1r->reinitialize_threads();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1800
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1801 int processing_threshold_delta = MAX2((int)(cg1r->green_zone() * sigma()), 1);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1802 int processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1803 cg1r->yellow_zone());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1804 // Change the barrier params
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1805 dcqs.set_process_completed_threshold(processing_threshold);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1806 dcqs.set_max_completed_queue(cg1r->red_zone());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1807 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1808
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1809 int curr_queue_size = dcqs.completed_buffers_num();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1810 if (curr_queue_size >= cg1r->yellow_zone()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1811 dcqs.set_completed_queue_padding(curr_queue_size);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1812 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1813 dcqs.set_completed_queue_padding(0);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1814 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1815 dcqs.notify_if_necessary();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1816 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1817
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1818 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1819 G1CollectorPolicy::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1820 predict_young_collection_elapsed_time_ms(size_t adjustment) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1821 guarantee( adjustment == 0 || adjustment == 1, "invariant" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1822
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1823 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
1824 size_t young_num = g1h->young_list()->length();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1825 if (young_num == 0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1826 return 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1827
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1828 young_num += adjustment;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1829 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
1830 size_t rs_lengths = g1h->young_list()->sampled_rs_lengths() +
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1831 predict_rs_length_diff();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1832 size_t card_num;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1833 if (full_young_gcs())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1834 card_num = predict_young_card_num(rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1835 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1836 card_num = predict_non_young_card_num(rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1837 size_t young_byte_size = young_num * HeapRegion::GrainBytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1838 double accum_yg_surv_rate =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1839 _short_lived_surv_rate_group->accum_surv_rate(adjustment);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1840
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1841 size_t bytes_to_copy =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1842 (size_t) (accum_yg_surv_rate * (double) HeapRegion::GrainBytes);
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 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1845 predict_rs_update_time_ms(pending_cards) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1846 predict_rs_scan_time_ms(card_num) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1847 predict_object_copy_time_ms(bytes_to_copy) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1848 predict_young_other_time_ms(young_num) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1849 predict_constant_other_time_ms();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1850 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1851
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1852 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1853 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1854 size_t rs_length = predict_rs_length_diff();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1855 size_t card_num;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1856 if (full_young_gcs())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1857 card_num = predict_young_card_num(rs_length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1858 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1859 card_num = predict_non_young_card_num(rs_length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1860 return predict_base_elapsed_time_ms(pending_cards, card_num);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1861 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1862
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1863 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1864 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1865 size_t scanned_cards) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1866 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1867 predict_rs_update_time_ms(pending_cards) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1868 predict_rs_scan_time_ms(scanned_cards) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1869 predict_constant_other_time_ms();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1870 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1871
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1872 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1873 G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1874 bool young) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1875 size_t rs_length = hr->rem_set()->occupied();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1876 size_t card_num;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1877 if (full_young_gcs())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1878 card_num = predict_young_card_num(rs_length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1879 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1880 card_num = predict_non_young_card_num(rs_length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1881 size_t bytes_to_copy = predict_bytes_to_copy(hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1882
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1883 double region_elapsed_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1884 predict_rs_scan_time_ms(card_num) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1885 predict_object_copy_time_ms(bytes_to_copy);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1886
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1887 if (young)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1888 region_elapsed_time_ms += predict_young_other_time_ms(1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1889 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1890 region_elapsed_time_ms += predict_non_young_other_time_ms(1);
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 return region_elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1893 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1894
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1895 size_t
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1896 G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1897 size_t bytes_to_copy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1898 if (hr->is_marked())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1899 bytes_to_copy = hr->max_live_bytes();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1900 else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1901 guarantee( hr->is_young() && hr->age_in_surv_rate_group() != -1,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1902 "invariant" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1903 int age = hr->age_in_surv_rate_group();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1904 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
1905 bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1906 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1907
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1908 return bytes_to_copy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1909 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1910
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1911 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1912 G1CollectorPolicy::start_recording_regions() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1913 _recorded_rs_lengths = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1914 _recorded_young_regions = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1915 _recorded_non_young_regions = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1916
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1917 #if PREDICTIONS_VERBOSE
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1918 _recorded_marked_bytes = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1919 _recorded_young_bytes = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1920 _predicted_bytes_to_copy = 0;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1921 _predicted_rs_lengths = 0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1922 _predicted_cards_scanned = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1923 #endif // PREDICTIONS_VERBOSE
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1924 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1925
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1926 void
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1927 G1CollectorPolicy::record_cset_region_info(HeapRegion* hr, bool young) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1928 #if PREDICTIONS_VERBOSE
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1929 if (!young) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1930 _recorded_marked_bytes += hr->max_live_bytes();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1931 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1932 _predicted_bytes_to_copy += predict_bytes_to_copy(hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1933 #endif // PREDICTIONS_VERBOSE
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1934
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1935 size_t rs_length = hr->rem_set()->occupied();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1936 _recorded_rs_lengths += rs_length;
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 void
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1940 G1CollectorPolicy::record_non_young_cset_region(HeapRegion* hr) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1941 assert(!hr->is_young(), "should not call this");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1942 ++_recorded_non_young_regions;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1943 record_cset_region_info(hr, false);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1944 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1945
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1946 void
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1947 G1CollectorPolicy::set_recorded_young_regions(size_t n_regions) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1948 _recorded_young_regions = n_regions;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1949 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1950
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1951 void G1CollectorPolicy::set_recorded_young_bytes(size_t bytes) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1952 #if PREDICTIONS_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1953 _recorded_young_bytes = bytes;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1954 #endif // PREDICTIONS_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1955 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1956
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1957 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
1958 _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
1959 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1960
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1961 void G1CollectorPolicy::set_predicted_bytes_to_copy(size_t bytes) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1962 _predicted_bytes_to_copy = bytes;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1963 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1964
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1965 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1966 G1CollectorPolicy::end_recording_regions() {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1967 // The _predicted_pause_time_ms field is referenced in code
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1968 // not under PREDICTIONS_VERBOSE. Let's initialize it.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1969 _predicted_pause_time_ms = -1.0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1970
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1971 #if PREDICTIONS_VERBOSE
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1972 _predicted_pending_cards = predict_pending_cards();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1973 _predicted_rs_lengths = _recorded_rs_lengths + predict_rs_length_diff();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1974 if (full_young_gcs())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1975 _predicted_cards_scanned += predict_young_card_num(_predicted_rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1976 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1977 _predicted_cards_scanned +=
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1978 predict_non_young_card_num(_predicted_rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1979 _recorded_region_num = _recorded_young_regions + _recorded_non_young_regions;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1980
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1981 _predicted_rs_update_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1982 predict_rs_update_time_ms(_g1->pending_card_num());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1983 _predicted_rs_scan_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1984 predict_rs_scan_time_ms(_predicted_cards_scanned);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1985 _predicted_object_copy_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1986 predict_object_copy_time_ms(_predicted_bytes_to_copy);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1987 _predicted_constant_other_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1988 predict_constant_other_time_ms();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1989 _predicted_young_other_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1990 predict_young_other_time_ms(_recorded_young_regions);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1991 _predicted_non_young_other_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1992 predict_non_young_other_time_ms(_recorded_non_young_regions);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1993
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1994 _predicted_pause_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1995 _predicted_rs_update_time_ms +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1996 _predicted_rs_scan_time_ms +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1997 _predicted_object_copy_time_ms +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1998 _predicted_constant_other_time_ms +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1999 _predicted_young_other_time_ms +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2000 _predicted_non_young_other_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2001 #endif // PREDICTIONS_VERBOSE
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2002 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2003
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2004 void G1CollectorPolicy::check_if_region_is_too_expensive(double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2005 predicted_time_ms) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2006 // 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
2007 // 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
2008 if (predicted_time_ms > _expensive_region_limit_ms) {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2009 ergo_verbose2(ErgoPartiallyYoungGCs,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2010 "request partially-young GCs end",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2011 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
2012 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
2013 ergo_format_ms("threshold"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2014 predicted_time_ms, _expensive_region_limit_ms);
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2015 // no point in doing another partial one
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2016 _should_revert_to_full_young_gcs = true;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2017 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2018 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2019
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2020 // </NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2021
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2022
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2023 void G1CollectorPolicy::update_recent_gc_times(double end_time_sec,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2024 double elapsed_ms) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2025 _recent_gc_times_ms->add(elapsed_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2026 _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
2027 _prev_collection_pause_end_ms = end_time_sec * 1000.0;
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 double G1CollectorPolicy::recent_avg_time_for_pauses_ms() {
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2031 if (_recent_pause_times_ms->num() == 0) {
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2032 return (double) MaxGCPauseMillis;
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2033 }
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2034 return _recent_pause_times_ms->avg();
342
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
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2037 double G1CollectorPolicy::recent_avg_time_for_rs_scan_ms() {
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2038 if (_recent_rs_scan_times_ms->num() == 0) {
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
2039 return (double)MaxGCPauseMillis/3.0;
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2040 }
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2041 return _recent_rs_scan_times_ms->avg();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2042 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2043
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2044 int G1CollectorPolicy::number_of_recent_gcs() {
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2045 assert(_recent_rs_scan_times_ms->num() ==
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2046 _recent_pause_times_ms->num(), "Sequence out of sync");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2047 assert(_recent_pause_times_ms->num() ==
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2048 _recent_CS_bytes_used_before->num(), "Sequence out of sync");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2049 assert(_recent_CS_bytes_used_before->num() ==
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2050 _recent_CS_bytes_surviving->num(), "Sequence out of sync");
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
2051
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2052 return _recent_pause_times_ms->num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2053 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2054
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2055 double G1CollectorPolicy::recent_avg_survival_fraction() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2056 return recent_avg_survival_fraction_work(_recent_CS_bytes_surviving,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2057 _recent_CS_bytes_used_before);
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 double G1CollectorPolicy::last_survival_fraction() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2061 return last_survival_fraction_work(_recent_CS_bytes_surviving,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2062 _recent_CS_bytes_used_before);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2063 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2064
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2065 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2066 G1CollectorPolicy::recent_avg_survival_fraction_work(TruncatedSeq* surviving,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2067 TruncatedSeq* before) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2068 assert(surviving->num() == before->num(), "Sequence out of sync");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2069 if (before->sum() > 0.0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2070 double recent_survival_rate = surviving->sum() / before->sum();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2071 // We exempt parallel collection from this check because Alloc Buffer
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2072 // fragmentation can produce negative collections.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2073 // 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
2074 // 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
2075 // (DLD, 10/05.)
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
2076 assert((true || G1CollectedHeap::use_parallel_gc_threads()) ||
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2077 _g1->evacuation_failed() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2078 recent_survival_rate <= 1.0, "Or bad frac");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2079 return recent_survival_rate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2080 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2081 return 1.0; // Be conservative.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2082 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2083 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2084
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2085 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2086 G1CollectorPolicy::last_survival_fraction_work(TruncatedSeq* surviving,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2087 TruncatedSeq* before) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2088 assert(surviving->num() == before->num(), "Sequence out of sync");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2089 if (surviving->num() > 0 && before->last() > 0.0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2090 double last_survival_rate = surviving->last() / before->last();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2091 // We exempt parallel collection from this check because Alloc Buffer
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2092 // fragmentation can produce negative collections.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2093 // 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
2094 // 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
2095 // (DLD, 10/05.)
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
2096 assert((true || G1CollectedHeap::use_parallel_gc_threads()) ||
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2097 last_survival_rate <= 1.0, "Or bad frac");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2098 return last_survival_rate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2099 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2100 return 1.0;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2104 static const int survival_min_obs = 5;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2105 static double survival_min_obs_limits[] = { 0.9, 0.7, 0.5, 0.3, 0.1 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2106 static const double min_survival_rate = 0.1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2107
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2108 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2109 G1CollectorPolicy::conservative_avg_survival_fraction_work(double avg,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2110 double latest) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2111 double res = avg;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2112 if (number_of_recent_gcs() < survival_min_obs) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2113 res = MAX2(res, survival_min_obs_limits[number_of_recent_gcs()]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2114 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2115 res = MAX2(res, latest);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2116 res = MAX2(res, min_survival_rate);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2117 // In the parallel case, LAB fragmentation can produce "negative
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2118 // collections"; so can evac failure. Cap at 1.0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2119 res = MIN2(res, 1.0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2120 return res;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2121 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2122
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2123 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
2124 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
2125 double threshold = _gc_overhead_perc;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2126 if (recent_gc_overhead > threshold) {
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
2127 // We will double the existing space, or take
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
2128 // G1ExpandByPercentOfAvailable % of the available expansion
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
2129 // space, whichever is smaller, bounded below by a minimum
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
2130 // expansion (unless that's all that's left.)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2131 const size_t min_expand_bytes = 1*M;
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2152
diff changeset
2132 size_t reserved_bytes = _g1->max_capacity();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2133 size_t committed_bytes = _g1->capacity();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2134 size_t uncommitted_bytes = reserved_bytes - committed_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2135 size_t expand_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2136 size_t expand_bytes_via_pct =
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
2137 uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2138 expand_bytes = MIN2(expand_bytes_via_pct, committed_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2139 expand_bytes = MAX2(expand_bytes, min_expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2140 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
2141
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2142 ergo_verbose5(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2143 "attempt heap expansion",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2144 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
2145 "threshold after GC")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2146 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
2147 ergo_format_perc("threshold")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2148 ergo_format_byte("uncommitted")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2149 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
2150 recent_gc_overhead, threshold,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2151 uncommitted_bytes,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2152 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
2153
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2154 return expand_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2155 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2156 return 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2157 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2158 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2159
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2160 class CountCSClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2161 G1CollectorPolicy* _g1_policy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2162 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2163 CountCSClosure(G1CollectorPolicy* g1_policy) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2164 _g1_policy(g1_policy) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2165 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2166 _g1_policy->_bytes_in_collection_set_before_gc += r->used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2167 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2168 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2169 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2170
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2171 void G1CollectorPolicy::count_CS_bytes_used() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2172 CountCSClosure cs_closure(this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2173 _g1->collection_set_iterate(&cs_closure);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2174 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2175
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2176 void G1CollectorPolicy::print_summary(int level,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2177 const char* str,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2178 NumberSeq* seq) const {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2179 double sum = seq->sum();
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2180 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
2181 str, sum / 1000.0, seq->avg());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2182 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2183
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2184 void G1CollectorPolicy::print_summary_sd(int level,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2185 const char* str,
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2186 NumberSeq* seq) const {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2187 print_summary(level, str, seq);
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2188 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
2189 seq->num(), seq->sd(), seq->maximum());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2190 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2191
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2192 void G1CollectorPolicy::check_other_times(int level,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2193 NumberSeq* other_times_ms,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2194 NumberSeq* calc_other_times_ms) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2195 bool should_print = false;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2196 LineBuffer buf(level + 2);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2197
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2198 double max_sum = MAX2(fabs(other_times_ms->sum()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2199 fabs(calc_other_times_ms->sum()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2200 double min_sum = MIN2(fabs(other_times_ms->sum()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2201 fabs(calc_other_times_ms->sum()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2202 double sum_ratio = max_sum / min_sum;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2203 if (sum_ratio > 1.1) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2204 should_print = true;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2205 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
2206 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2207
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2208 double max_avg = MAX2(fabs(other_times_ms->avg()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2209 fabs(calc_other_times_ms->avg()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2210 double min_avg = MIN2(fabs(other_times_ms->avg()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2211 fabs(calc_other_times_ms->avg()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2212 double avg_ratio = max_avg / min_avg;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2213 if (avg_ratio > 1.1) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2214 should_print = true;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2215 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
2216 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2217
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2218 if (other_times_ms->sum() < -0.01) {
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2219 buf.append_and_print_cr("## RECORDED OTHER SUM IS NEGATIVE ###");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2220 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2221
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2222 if (other_times_ms->avg() < -0.01) {
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2223 buf.append_and_print_cr("## RECORDED OTHER AVG IS NEGATIVE ###");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2224 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2225
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2226 if (calc_other_times_ms->sum() < -0.01) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2227 should_print = true;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2228 buf.append_and_print_cr("## CALCULATED OTHER SUM IS NEGATIVE ###");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2229 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2230
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2231 if (calc_other_times_ms->avg() < -0.01) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2232 should_print = true;
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2233 buf.append_and_print_cr("## CALCULATED OTHER AVG IS NEGATIVE ###");
342
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2236 if (should_print)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2237 print_summary(level, "Other(Calc)", calc_other_times_ms);
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 void G1CollectorPolicy::print_summary(PauseSummary* summary) const {
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
2241 bool parallel = G1CollectedHeap::use_parallel_gc_threads();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2242 MainBodySummary* body_summary = summary->main_body_summary();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2243 if (summary->get_total_seq()->num() > 0) {
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
2244 print_summary_sd(0, "Evacuation Pauses", summary->get_total_seq());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2245 if (body_summary != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2246 print_summary(1, "SATB Drain", body_summary->get_satb_drain_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2247 if (parallel) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2248 print_summary(1, "Parallel Time", body_summary->get_parallel_seq());
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2249 print_summary(2, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2250 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
2251 print_summary(2, "Update RS", body_summary->get_update_rs_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2252 print_summary(2, "Scan RS", body_summary->get_scan_rs_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2253 print_summary(2, "Object Copy", body_summary->get_obj_copy_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2254 print_summary(2, "Termination", body_summary->get_termination_seq());
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2255 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
2256 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2257 NumberSeq* other_parts[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2258 body_summary->get_ext_root_scan_seq(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2259 body_summary->get_mark_stack_scan_seq(),
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2260 body_summary->get_update_rs_seq(),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2261 body_summary->get_scan_rs_seq(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2262 body_summary->get_obj_copy_seq(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2263 body_summary->get_termination_seq()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2264 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2265 NumberSeq calc_other_times_ms(body_summary->get_parallel_seq(),
1779
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2266 6, other_parts);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2267 check_other_times(2, body_summary->get_parallel_other_seq(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2268 &calc_other_times_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2269 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2270 } else {
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2271 print_summary(1, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2272 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
2273 print_summary(1, "Update RS", body_summary->get_update_rs_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2274 print_summary(1, "Scan RS", body_summary->get_scan_rs_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2275 print_summary(1, "Object Copy", body_summary->get_obj_copy_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2276 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2277 }
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2278 print_summary(1, "Mark Closure", body_summary->get_mark_closure_seq());
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4013
diff changeset
2279 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
2280 print_summary(1, "Other", summary->get_other_seq());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2281 {
1779
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2282 if (body_summary != NULL) {
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2283 NumberSeq calc_other_times_ms;
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2284 if (parallel) {
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2285 // parallel
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2286 NumberSeq* other_parts[] = {
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2287 body_summary->get_satb_drain_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2288 body_summary->get_parallel_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2289 body_summary->get_clear_ct_seq()
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2290 };
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2291 calc_other_times_ms = NumberSeq(summary->get_total_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2292 3, other_parts);
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2293 } else {
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2294 // serial
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2295 NumberSeq* other_parts[] = {
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2296 body_summary->get_satb_drain_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2297 body_summary->get_update_rs_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2298 body_summary->get_ext_root_scan_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2299 body_summary->get_mark_stack_scan_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2300 body_summary->get_scan_rs_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2301 body_summary->get_obj_copy_seq()
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2302 };
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2303 calc_other_times_ms = NumberSeq(summary->get_total_seq(),
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2304 6, other_parts);
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2305 }
6eddcbe17c83 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 1707
diff changeset
2306 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
2307 }
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 } else {
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2310 LineBuffer(1).append_and_print_cr("none");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2311 }
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2312 LineBuffer(0).append_and_print_cr("");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2313 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2314
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2315 void G1CollectorPolicy::print_tracing_info() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2316 if (TraceGen0Time) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2317 gclog_or_tty->print_cr("ALL PAUSES");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2318 print_summary_sd(0, "Total", _all_pause_times_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2319 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2320 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2321 gclog_or_tty->print_cr(" Full Young GC Pauses: %8d", _full_young_pause_num);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2322 gclog_or_tty->print_cr(" Partial Young GC Pauses: %8d", _partial_young_pause_num);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2323 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2324
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
2325 gclog_or_tty->print_cr("EVACUATION PAUSES");
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
2326 print_summary(_summary);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2327
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2328 gclog_or_tty->print_cr("MISC");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2329 print_summary_sd(0, "Stop World", _all_stop_world_times_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2330 print_summary_sd(0, "Yields", _all_yield_times_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2331 for (int i = 0; i < _aux_num; ++i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2332 if (_all_aux_times_ms[i].num() > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2333 char buffer[96];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2334 sprintf(buffer, "Aux%d", i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2335 print_summary_sd(0, buffer, &_all_aux_times_ms[i]);
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 size_t all_region_num = _region_num_young + _region_num_tenured;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2340 gclog_or_tty->print_cr(" New Regions %8d, Young %8d (%6.2lf%%), "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2341 "Tenured %8d (%6.2lf%%)",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2342 all_region_num,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2343 _region_num_young,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2344 (double) _region_num_young / (double) all_region_num * 100.0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2345 _region_num_tenured,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2346 (double) _region_num_tenured / (double) all_region_num * 100.0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2347 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2348 if (TraceGen1Time) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2349 if (_all_full_gc_times_ms->num() > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2350 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
2351 _all_full_gc_times_ms->num(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2352 _all_full_gc_times_ms->sum() / 1000.0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2353 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
2354 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
2355 _all_full_gc_times_ms->sd(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2356 _all_full_gc_times_ms->maximum());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2357 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2358 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2359 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2360
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2361 void G1CollectorPolicy::print_yg_surv_rate_info() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2362 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2363 _short_lived_surv_rate_group->print_surv_rate_summary();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2364 // add this call for any other surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2365 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2366 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2367
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2368 void G1CollectorPolicy::update_region_num(bool young) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
2369 if (young) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2370 ++_region_num_young;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2371 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2372 ++_region_num_tenured;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2373 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2374 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2375
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2376 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2377 // for debugging, bit of a hack...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2378 static char*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2379 region_num_to_mbs(int length) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2380 static char buffer[64];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2381 double bytes = (double) (length * HeapRegion::GrainBytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2382 double mbs = bytes / (double) (1024 * 1024);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2383 sprintf(buffer, "%7.2lfMB", mbs);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2384 return buffer;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2385 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2386 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2387
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2388 size_t G1CollectorPolicy::max_regions(int purpose) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2389 switch (purpose) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2390 case GCAllocForSurvived:
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2391 return _max_survivor_regions;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2392 case GCAllocForTenured:
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2393 return REGIONS_UNLIMITED;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2394 default:
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2395 ShouldNotReachHere();
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2396 return REGIONS_UNLIMITED;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2397 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2398 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2399
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
2400 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
2401 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
2402 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
2403 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
2404 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
2405 // 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
2406 // 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
2407 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
2408 } else {
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
2409 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
2410 }
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
2411 _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
2412 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
2413 }
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
2414
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2415 // Calculates survivor space parameters.
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
2416 void G1CollectorPolicy::update_survivors_policy() {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
2417 double max_survivor_regions_d =
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
2418 (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
2419 // 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
2420 // 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
2421 _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
2422
3868
ae73da50be4b 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 3867
diff changeset
2423 _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2424 HeapRegion::GrainWords * _max_survivor_regions);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2425 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
2426
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2427 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2428 class HRSortIndexIsOKClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2429 CollectionSetChooser* _chooser;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2430 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2431 HRSortIndexIsOKClosure(CollectionSetChooser* chooser) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2432 _chooser(chooser) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2433
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2434 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2435 if (!r->continuesHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2436 assert(_chooser->regionProperlyOrdered(r), "Ought to be.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2437 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2438 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2439 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2440 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2441
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2442 bool G1CollectorPolicy::assertMarkedBytesDataOK() {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2443 HRSortIndexIsOKClosure cl(_collectionSetChooser);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2444 _g1->heap_region_iterate(&cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2445 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2446 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2447 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2448
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2449 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
2450 GCCause::Cause gc_cause) {
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2451 bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2452 if (!during_cycle) {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2453 ergo_verbose1(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2454 "request concurrent cycle initiation",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2455 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
2456 ergo_format_str("GC cause"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2457 GCCause::to_string(gc_cause));
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2458 set_initiate_conc_mark_if_possible();
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2459 return true;
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2460 } else {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2461 ergo_verbose1(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2462 "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
2463 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
2464 ergo_format_str("GC cause"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2465 GCCause::to_string(gc_cause));
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2466 return false;
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2467 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2468 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2469
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2470 void
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2471 G1CollectorPolicy::decide_on_conc_mark_initiation() {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2472 // 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
2473 // initial-mark pause.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2474
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2475 // 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
2476 // 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
2477 // 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
2478 // initial-mark pause).
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2479 assert(!during_initial_mark_pause(), "pre-condition");
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2480
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2481 if (initiate_conc_mark_if_possible()) {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2482 // 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
2483 // 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
2484 // concurrent marking cycle. So we might initiate one.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2485
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2486 bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2487 if (!during_cycle) {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2488 // 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
2489 // 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
2490 // initiate a new cycle.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2491
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2492 set_during_initial_mark_pause();
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
2493 // We do not allow non-full young GCs during marking.
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
2494 if (!full_young_gcs()) {
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
2495 set_full_young_gcs(true);
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
2496 ergo_verbose0(ErgoPartiallyYoungGCs,
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
2497 "end partially-young GCs",
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
2498 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
2499 }
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2500
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2501 // 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
2502 // we've already acted on it.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2503 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
2504
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2505 ergo_verbose0(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2506 "initiate concurrent cycle",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2507 ergo_format_reason("concurrent cycle initiation requested"));
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2508 } else {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2509 // The concurrent marking thread is still finishing up the
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2510 // 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
2511 // overlap. In particular, the concurrent marking thread might
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2512 // 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
2513 // 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
2514 // 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
2515 // 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
2516 // 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
2517 // periodically yields while clearing the next marking bitmap
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2518 // 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
2519 // 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
2520 // 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
2521 ergo_verbose0(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2522 "do not initiate concurrent cycle",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2523 ergo_format_reason("concurrent cycle already in progress"));
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2524 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2525 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2526 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
2527
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2528 class KnownGarbageClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2529 CollectionSetChooser* _hrSorted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2530
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2531 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2532 KnownGarbageClosure(CollectionSetChooser* hrSorted) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2533 _hrSorted(hrSorted)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2534 {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2535
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2536 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2537 // We only include humongous regions in collection
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2538 // sets when concurrent mark shows that their contained object is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2539 // unreachable.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2540
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2541 // Do we have any marking information for this region?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2542 if (r->is_marked()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2543 // We don't include humongous regions in collection
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2544 // 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
2545 // cycle. We also don't include young regions because we *must*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2546 // include them in the next collection pause.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2547 if (!r->isHumongous() && !r->is_young()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2548 _hrSorted->addMarkedHeapRegion(r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2549 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2550 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2551 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2552 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2553 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2554
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2555 class ParKnownGarbageHRClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2556 CollectionSetChooser* _hrSorted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2557 jint _marked_regions_added;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2558 jint _chunk_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2559 jint _cur_chunk_idx;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2560 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
2561 int _worker;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2562 int _invokes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2563
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2564 void get_new_chunk() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2565 _cur_chunk_idx = _hrSorted->getParMarkedHeapRegionChunk(_chunk_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2566 _cur_chunk_end = _cur_chunk_idx + _chunk_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2567 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2568 void add_region(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2569 if (_cur_chunk_idx == _cur_chunk_end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2570 get_new_chunk();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2571 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2572 assert(_cur_chunk_idx < _cur_chunk_end, "postcondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2573 _hrSorted->setMarkedHeapRegion(_cur_chunk_idx, r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2574 _marked_regions_added++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2575 _cur_chunk_idx++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2576 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2577
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2578 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2579 ParKnownGarbageHRClosure(CollectionSetChooser* hrSorted,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2580 jint chunk_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2581 int worker) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2582 _hrSorted(hrSorted), _chunk_size(chunk_size), _worker(worker),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2583 _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
2584 _invokes(0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2585 {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2586
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2587 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2588 // We only include humongous regions in collection
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2589 // sets when concurrent mark shows that their contained object is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2590 // unreachable.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2591 _invokes++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2592
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2593 // Do we have any marking information for this region?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2594 if (r->is_marked()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2595 // We don't include humongous regions in collection
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2596 // 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
2597 // cycle.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2598 // We also do not include young regions in collection sets
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2599 if (!r->isHumongous() && !r->is_young()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2600 add_region(r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2601 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2602 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2603 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2604 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2605 jint marked_regions_added() { return _marked_regions_added; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2606 int invokes() { return _invokes; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2607 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2608
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2609 class ParKnownGarbageTask: public AbstractGangTask {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2610 CollectionSetChooser* _hrSorted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2611 jint _chunk_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2612 G1CollectedHeap* _g1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2613 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2614 ParKnownGarbageTask(CollectionSetChooser* hrSorted, jint chunk_size) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2615 AbstractGangTask("ParKnownGarbageTask"),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2616 _hrSorted(hrSorted), _chunk_size(chunk_size),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2617 _g1(G1CollectedHeap::heap())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2618 {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2619
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2620 void work(int i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2621 ParKnownGarbageHRClosure parKnownGarbageCl(_hrSorted, _chunk_size, i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2622 // Back to zero for the claim value.
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
2623 _g1->heap_region_par_iterate_chunked(&parKnownGarbageCl, i,
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
2624 HeapRegion::InitialClaimValue);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2625 jint regions_added = parKnownGarbageCl.marked_regions_added();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2626 _hrSorted->incNumMarkedHeapRegions(regions_added);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2627 if (G1PrintParCleanupStats) {
2363
c93aa6caa02f 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 2188
diff changeset
2628 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
2629 i, parKnownGarbageCl.invokes(), regions_added);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2630 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2631 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2632 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2633
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2634 void
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2635 G1CollectorPolicy::record_concurrent_mark_cleanup_end() {
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2636 double start_sec;
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2637 if (G1PrintParCleanupStats) {
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2638 start_sec = os::elapsedTime();
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2639 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2640
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2641 _collectionSetChooser->clearMarkedHeapRegions();
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2642 double clear_marked_end_sec;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2643 if (G1PrintParCleanupStats) {
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2644 clear_marked_end_sec = os::elapsedTime();
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2645 gclog_or_tty->print_cr(" clear marked regions: %8.3f ms.",
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2646 (clear_marked_end_sec - start_sec) * 1000.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2647 }
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2648
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
2649 if (G1CollectedHeap::use_parallel_gc_threads()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2650 const size_t OverpartitionFactor = 4;
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1394
diff changeset
2651 const size_t MinWorkUnit = 8;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1394
diff changeset
2652 const size_t WorkUnit =
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2653 MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor),
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1394
diff changeset
2654 MinWorkUnit);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2655 _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
2656 WorkUnit);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2657 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
2658 (int) WorkUnit);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2659 _g1->workers()->run_task(&parKnownGarbageTask);
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
2660
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
2661 assert(_g1->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
2662 "sanity check");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2663 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2664 KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2665 _g1->heap_region_iterate(&knownGarbagecl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2666 }
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2667 double known_garbage_end_sec;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2668 if (G1PrintParCleanupStats) {
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2669 known_garbage_end_sec = os::elapsedTime();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2670 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
2671 (known_garbage_end_sec - clear_marked_end_sec) * 1000.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2672 }
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2673
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2674 _collectionSetChooser->sortMarkedHeapRegions();
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2675 double end_sec = os::elapsedTime();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2676 if (G1PrintParCleanupStats) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2677 gclog_or_tty->print_cr(" sorting: %8.3f ms.",
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2678 (end_sec - known_garbage_end_sec) * 1000.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2679 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2680
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2681 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
2682 _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms);
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2683 _cur_mark_stop_world_time_ms += elapsed_time_ms;
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2684 _prev_collection_pause_end_ms += elapsed_time_ms;
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2685 _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
2686 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2687
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2688 // Add the heap region at the head of the non-incremental collection set
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2689 void G1CollectorPolicy::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2690 add_to_collection_set(HeapRegion* hr) {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2691 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
2692 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
2693
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2694 if (_g1->mark_in_progress())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2695 _g1->concurrent_mark()->registerCSetRegion(hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2696
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2697 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
2698 hr->set_in_collection_set(true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2699 hr->set_next_in_collection_set(_collection_set);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2700 _collection_set = hr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2701 _collection_set_size++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2702 _collection_set_bytes_used_before += hr->used();
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 470
diff changeset
2703 _g1->register_region_with_in_cset_fast_test(hr);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2704 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2705
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2706 // 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
2707 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
2708 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
2709
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2710 _inc_cset_head = NULL;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2711 _inc_cset_tail = NULL;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2712 _inc_cset_size = 0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2713 _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
2714
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2715 _inc_cset_young_index = 0;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2716
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2717 _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
2718 _inc_cset_recorded_young_bytes = 0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2719 _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
2720 _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
2721 _inc_cset_predicted_bytes_to_copy = 0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2722 _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
2723 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2724
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2725 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
2726 // 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
2727 // * 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
2728 // evacuation pause,
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2729 // * 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
2730 // 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
2731 // * 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
2732 // 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
2733 // 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
2734 // 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
2735 // 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
2736 // refine thread (RSet sampling).
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2737
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2738 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
2739 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
2740
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2741 _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
2742 _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
2743
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2744 _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
2745
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2746 // 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
2747 // 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
2748 // 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
2749 // rset sampling code
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2750 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
2751 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
2752
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2753 #if PREDICTIONS_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2754 size_t bytes_to_copy = predict_bytes_to_copy(hr);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2755 _inc_cset_predicted_bytes_to_copy += bytes_to_copy;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2756
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2757 // Record the number of bytes used in this region
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2758 _inc_cset_recorded_young_bytes += used_bytes;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2759
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2760 // 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
2761 // 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
2762 // 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
2763 // rset sampling code
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2764 hr->set_predicted_bytes_to_copy(bytes_to_copy);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2765 #endif // PREDICTIONS_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2766 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2767
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2768 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
2769 // 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
2770 // 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
2771 // 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
2772 // 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
2773
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2774 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
2775 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
2776
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2777 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
2778 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
2779 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
2780
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2781 // 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
2782 // 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
2783 _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
2784 _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
2785
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2786 _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
2787
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2788 // 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
2789 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
2790 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
2791
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2792 #if PREDICTIONS_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2793 size_t old_predicted_bytes_to_copy = hr->predicted_bytes_to_copy();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2794 _inc_cset_predicted_bytes_to_copy -= old_predicted_bytes_to_copy;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2795
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2796 // Subtract the number of bytes used in this region
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2797 _inc_cset_recorded_young_bytes -= used_bytes;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2798
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2799 // 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
2800 hr->set_predicted_bytes_to_copy(0);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2801 #endif // PREDICTIONS_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2802 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2803
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2804 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
2805 // 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
2806 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
2807
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2808 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
2809 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
2810 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2811
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2812 void G1CollectorPolicy::add_region_to_incremental_cset_common(HeapRegion* hr) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2813 assert( hr->is_young(), "invariant");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2814 assert( hr->young_index_in_cset() == -1, "invariant" );
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2815 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
2816
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2817 // 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
2818 // 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
2819 // 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
2820 // 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
2821 // 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
2822 // 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
2823
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2824 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
2825 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
2826
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2827 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
2828 _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
2829
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2830 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
2831 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
2832 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
2833
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2834 _inc_cset_size++;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2835 _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
2836
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2837 hr->set_young_index_in_cset((int) _inc_cset_young_index);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2838 ++_inc_cset_young_index;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2839 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2840
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2841 // 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
2842 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
2843 // 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
2844 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
2845
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2846 // Do the 'common' stuff
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2847 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
2848
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2849 // 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
2850 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
2851 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
2852 _inc_cset_head = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2853 } else {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2854 _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
2855 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2856 _inc_cset_tail = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2857 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2858
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2859 // 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
2860 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
2861 // 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
2862 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
2863
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2864 // Do the 'common' stuff
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2865 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
2866
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2867 // 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
2868 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
2869 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
2870 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
2871 _inc_cset_tail = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2872 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2873 _inc_cset_head = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2874 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2875
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2876 #ifndef PRODUCT
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2877 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
2878 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
2879
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2880 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
2881 HeapRegion* csr = list_head;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2882 while (csr != NULL) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2883 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
2884 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
2885 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
2886 "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
2887 csr->bottom(), csr->end(),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2888 csr->top(),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2889 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
2890 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
2891 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
2892 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
2893 csr->is_young(),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2894 csr->is_survivor());
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2895 csr = next;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2896 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2897 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2898 #endif // !PRODUCT
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2899
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
2900 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
2901 // 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
2902 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
2903
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2904 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
2905
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2906 start_recording_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2907
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2908 guarantee(target_pause_time_ms > 0.0,
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2909 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
2910 target_pause_time_ms));
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2911 guarantee(_collection_set == NULL, "Precondition");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2912
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2913 double base_time_ms = predict_base_elapsed_time_ms(_pending_cards);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2914 double predicted_pause_time_ms = base_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2915
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2916 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
2917
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2918 ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2919 "start choosing CSet",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2920 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
2921 ergo_format_ms("remaining time")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2922 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
2923 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
2924
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2925 // 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
2926 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
2927 if (time_remaining_ms < threshold) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2928 double prev_time_remaining_ms = time_remaining_ms;
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2929 time_remaining_ms = 0.50 * target_pause_time_ms;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2930 _within_target = false;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2931 ergo_verbose3(ErgoCSetConstruction,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2932 "adjust remaining time",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2933 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
2934 ergo_format_ms("remaining time")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2935 ergo_format_ms("threshold")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2936 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
2937 prev_time_remaining_ms, threshold, time_remaining_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2938 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2939 _within_target = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2940 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2941
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2942 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
2943
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2944 HeapRegion* hr;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2945 double young_start_time_sec = os::elapsedTime();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2946
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
2947 _collection_set_bytes_used_before = 0;
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
2948 _collection_set_size = 0;
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2949 _young_cset_length = 0;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2950 _last_young_gc_full = full_young_gcs() ? true : false;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2951
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2952 if (_last_young_gc_full) {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2953 ++_full_young_pause_num;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2954 } else {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2955 ++_partial_young_pause_num;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2956 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2957
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2958 // 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
2959 // 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
2960 // [Newly Young Regions ++ Survivors from last pause].
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2961
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2962 size_t survivor_region_num = young_list->survivor_length();
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2963 size_t eden_region_num = young_list->length() - survivor_region_num;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2964 size_t old_region_num = 0;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2965 hr = young_list->first_survivor_region();
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2966 while (hr != NULL) {
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2967 assert(hr->is_survivor(), "badly formed young list");
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2968 hr->set_young();
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2969 hr = hr->get_next_young_region();
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2970 }
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2971
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2972 // 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
2973 young_list->clear_survivors();
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2974
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2975 if (_g1->mark_in_progress())
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2976 _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
2977
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2978 _young_cset_length = _inc_cset_young_index;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2979 _collection_set = _inc_cset_head;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2980 _collection_set_size = _inc_cset_size;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2981 _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
2982 time_remaining_ms -= _inc_cset_predicted_elapsed_time_ms;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2983 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
2984
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2985 ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2986 "add young regions to CSet",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2987 ergo_format_region("eden")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2988 ergo_format_region("survivors")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2989 ergo_format_ms("predicted young region time"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2990 eden_region_num, survivor_region_num,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2991 _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
2992
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2993 // The number of recorded young regions is the incremental
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2994 // collection set's current size
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2995 set_recorded_young_regions(_inc_cset_size);
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2996 set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths);
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2997 set_recorded_young_bytes(_inc_cset_recorded_young_bytes);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2998 #if PREDICTIONS_VERBOSE
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2999 set_predicted_bytes_to_copy(_inc_cset_predicted_bytes_to_copy);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
3000 #endif // PREDICTIONS_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
3001
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3002 assert(_inc_cset_size == young_list->length(), "Invariant");
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3003
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3004 double young_end_time_sec = os::elapsedTime();
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3005 _recorded_young_cset_choice_time_ms =
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3006 (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
3007
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3008 // We are doing young collections so reset this.
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3009 non_young_start_time_sec = young_end_time_sec;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3010
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
3011 if (!full_young_gcs()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3012 bool should_continue = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3013 NumberSeq seq;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3014 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
3015
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3016 size_t prev_collection_set_size = _collection_set_size;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3017 double prev_predicted_pause_time_ms = predicted_pause_time_ms;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3018 do {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3019 hr = _collectionSetChooser->getNextMarkedRegion(time_remaining_ms,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3020 avg_prediction);
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
3021 if (hr != NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3022 double predicted_time_ms = predict_region_elapsed_time_ms(hr, false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3023 time_remaining_ms -= predicted_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3024 predicted_pause_time_ms += predicted_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3025 add_to_collection_set(hr);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
3026 record_non_young_cset_region(hr);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3027 seq.add(predicted_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3028 avg_prediction = seq.avg() + seq.sd();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3029 }
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3030
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3031 should_continue = true;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3032 if (hr == NULL) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3033 // 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
3034 // 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
3035 should_continue = false;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3036 } else {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3037 if (adaptive_young_list_length()) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3038 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
3039 ergo_verbose1(ErgoCSetConstruction,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3040 "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
3041 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
3042 ergo_format_ms("remaining time"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3043 time_remaining_ms);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3044 should_continue = false;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3045 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3046 } else {
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
3047 if (_collection_set_size >= _young_list_fixed_length) {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3048 ergo_verbose2(ErgoCSetConstruction,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3049 "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
3050 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
3051 ergo_format_region("CSet")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3052 ergo_format_region("young target"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3053 _collection_set_size, _young_list_fixed_length);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3054 should_continue = false;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3055 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3056 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3057 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3058 } while (should_continue);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3059
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3060 if (!adaptive_young_list_length() &&
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3061 _collection_set_size < _young_list_fixed_length) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3062 ergo_verbose2(ErgoCSetConstruction,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3063 "request partially-young GCs end",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3064 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
3065 ergo_format_region("CSet")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3066 ergo_format_region("young target"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3067 _collection_set_size, _young_list_fixed_length);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3068 _should_revert_to_full_young_gcs = true;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3069 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3070
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3071 old_region_num = _collection_set_size - prev_collection_set_size;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3072
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3073 ergo_verbose2(ErgoCSetConstruction | ErgoHigh,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3074 "add old regions to CSet",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3075 ergo_format_region("old")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3076 ergo_format_ms("predicted old region time"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3077 old_region_num,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3078 predicted_pause_time_ms - prev_predicted_pause_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3079 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3080
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
3081 stop_incremental_cset_building();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
3082
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3083 count_CS_bytes_used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3084
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3085 end_recording_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3086
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3087 ergo_verbose5(ErgoCSetConstruction,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3088 "finish choosing CSet",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3089 ergo_format_region("eden")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3090 ergo_format_region("survivors")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3091 ergo_format_region("old")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3092 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
3093 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
3094 eden_region_num, survivor_region_num, old_region_num,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
3095 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
3096
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3097 double non_young_end_time_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3098 _recorded_non_young_cset_choice_time_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3099 (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
3100 }