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

7113012: G1: rename not-fully-young GCs as "mixed" Summary: Renamed partially-young GCs as mixed and fully-young GCs as young. Change all external output that includes those terms (GC log and GC ergo log) as well as any comments, fields, methods, etc. The changeset also includes very minor code tidying up (added some curly brackets). Reviewed-by: johnc, brutisso
author tonyp
date Fri, 16 Dec 2011 02:14:27 -0500
parents f95d63e2154a
children 2c0751569716
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 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
2 * Copyright (c) 2001, 2010, 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: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_implementation/g1/heapRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "gc_implementation/g1/survRateGroup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/allocation.hpp"
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
31
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
32 SurvRateGroup::SurvRateGroup(G1CollectorPolicy* g1p,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
33 const char* name,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 size_t summary_surv_rates_len) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 _g1p(g1p), _name(name),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36 _summary_surv_rates_len(summary_surv_rates_len),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 _summary_surv_rates_max_len(0),
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
38 _summary_surv_rates(NULL),
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
39 _surv_rate(NULL),
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
40 _accum_surv_rate_pred(NULL),
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
41 _surv_rate_pred(NULL)
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
42 {
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
43 reset();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 if (summary_surv_rates_len > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 size_t length = summary_surv_rates_len;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 if (_summary_surv_rates == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 vm_exit_out_of_memory(sizeof(NumberSeq*) * length,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49 "Not enough space for surv rate summary");
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 for (size_t i = 0; i < length; ++i)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 _summary_surv_rates[i] = new NumberSeq();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53 }
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 start_adding_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
58
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
59 void SurvRateGroup::reset()
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
60 {
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
61 _all_regions_allocated = 0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
62 _setup_seq_num = 0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
63 _stats_arrays_length = 0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
64 _accum_surv_rate = 0.0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
65 _last_pred = 0.0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
66 // the following will set up the arrays with length 1
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
67 _region_num = 1;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
68 stop_adding_regions();
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
69 guarantee( _stats_arrays_length == 1, "invariant" );
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
70 guarantee( _surv_rate_pred[0] != NULL, "invariant" );
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
71 _surv_rate_pred[0]->add(0.4);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
72 all_surviving_words_recorded(false);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
73 _region_num = 0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
74 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
75
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
76
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 SurvRateGroup::start_adding_regions() {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
79 _setup_seq_num = _stats_arrays_length;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 579
diff changeset
80 _region_num = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 _accum_surv_rate = 0.0;
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 #if 0
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
84 gclog_or_tty->print_cr("[%s] start adding regions, seq num %d, length %d",
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
85 _name, _setup_seq_num, _region_num);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
86 #endif // 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90 SurvRateGroup::stop_adding_regions() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
92 #if 0
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
93 gclog_or_tty->print_cr("[%s] stop adding regions, length %d", _name, _region_num);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
94 #endif // 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
95
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
96 if (_region_num > _stats_arrays_length) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
97 double* old_surv_rate = _surv_rate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
98 double* old_accum_surv_rate_pred = _accum_surv_rate_pred;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99 TruncatedSeq** old_surv_rate_pred = _surv_rate_pred;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
100
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
101 _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 if (_surv_rate == NULL) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
103 vm_exit_out_of_memory(sizeof(double) * _region_num,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 "Not enough space for surv rate array.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
105 }
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
106 _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
107 if (_accum_surv_rate_pred == NULL) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
108 vm_exit_out_of_memory(sizeof(double) * _region_num,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
109 "Not enough space for accum surv rate pred array.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
110 }
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
111 _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
112 if (_surv_rate == NULL) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
113 vm_exit_out_of_memory(sizeof(TruncatedSeq*) * _region_num,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114 "Not enough space for surv rate pred array.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
117 for (size_t i = 0; i < _stats_arrays_length; ++i)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 _surv_rate_pred[i] = old_surv_rate_pred[i];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
119
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 #if 0
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
121 gclog_or_tty->print_cr("[%s] stop adding regions, new seqs %d to %d",
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
122 _name, _array_length, _region_num - 1);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
123 #endif // 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
124
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
125 for (size_t i = _stats_arrays_length; i < _region_num; ++i) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126 _surv_rate_pred[i] = new TruncatedSeq(10);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 // _surv_rate_pred[i]->add(last_pred);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
129
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
130 _stats_arrays_length = _region_num;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
131
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
132 if (old_surv_rate != NULL)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
133 FREE_C_HEAP_ARRAY(double, old_surv_rate);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 if (old_accum_surv_rate_pred != NULL)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 if (old_surv_rate_pred != NULL)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 FREE_C_HEAP_ARRAY(NumberSeq*, old_surv_rate_pred);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
140 for (size_t i = 0; i < _stats_arrays_length; ++i)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 _surv_rate[i] = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 SurvRateGroup::accum_surv_rate(size_t adjustment) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 // we might relax this one in the future...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 guarantee( adjustment == 0 || adjustment == 1, "pre-condition" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149 double ret = _accum_surv_rate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 if (adjustment > 0) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
151 TruncatedSeq* seq = get_seq(_region_num+1);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 double surv_rate = _g1p->get_new_prediction(seq);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 ret += surv_rate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
159 int
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 SurvRateGroup::next_age_index() {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
161 TruncatedSeq* seq = get_seq(_region_num);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162 double surv_rate = _g1p->get_new_prediction(seq);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163 _accum_surv_rate += surv_rate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
165 ++_region_num;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
166 return (int) ++_all_regions_allocated;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
169 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 SurvRateGroup::record_surviving_words(int age_in_group, size_t surv_words) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
171 guarantee( 0 <= age_in_group && (size_t) age_in_group < _region_num,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172 "pre-condition" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 guarantee( _surv_rate[age_in_group] <= 0.00001,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 "should only update each slot once" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 double surv_rate = (double) surv_words / (double) HeapRegion::GrainWords;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 _surv_rate[age_in_group] = surv_rate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 _surv_rate_pred[age_in_group]->add(surv_rate);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179 if ((size_t)age_in_group < _summary_surv_rates_len) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 _summary_surv_rates[age_in_group]->add(surv_rate);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 if ((size_t)(age_in_group+1) > _summary_surv_rates_max_len)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182 _summary_surv_rates_max_len = age_in_group+1;
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 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 SurvRateGroup::all_surviving_words_recorded(bool propagate) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
188 if (propagate && _region_num > 0) { // conservative
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
189 double surv_rate = _surv_rate_pred[_region_num-1]->last();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 #if 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 gclog_or_tty->print_cr("propagating %1.2lf from %d to %d",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 surv_rate, _curr_length, _array_length - 1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 #endif // 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
196 for (size_t i = _region_num; i < _stats_arrays_length; ++i) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 guarantee( _surv_rate[i] <= 0.00001,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 "the slot should not have been updated" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 _surv_rate_pred[i]->add(surv_rate);
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 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 double accum = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 double pred = 0.0;
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
205 for (size_t i = 0; i < _stats_arrays_length; ++i) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 pred = _g1p->get_new_prediction(_surv_rate_pred[i]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 if (pred > 1.0) pred = 1.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 accum += pred;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 _accum_surv_rate_pred[i] = accum;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 // gclog_or_tty->print_cr("age %3d, accum %10.2lf", i, accum);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 _last_pred = pred;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 SurvRateGroup::print() {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 579
diff changeset
218 gclog_or_tty->print_cr("Surv Rate Group: %s (%d entries)",
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 579
diff changeset
219 _name, _region_num);
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 342
diff changeset
220 for (size_t i = 0; i < _region_num; ++i) {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 579
diff changeset
221 gclog_or_tty->print_cr(" age %4d surv rate %6.2lf %% pred %6.2lf %%",
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222 i, _surv_rate[i] * 100.0,
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 579
diff changeset
223 _g1p->get_new_prediction(_surv_rate_pred[i]) * 100.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
224 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 }
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 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
228 SurvRateGroup::print_surv_rate_summary() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 size_t length = _summary_surv_rates_max_len;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230 if (length == 0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
234 gclog_or_tty->print_cr("%s Rate Summary (for up to age %d)", _name, length-1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 gclog_or_tty->print_cr(" age range survival rate (avg) samples (avg)");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236 gclog_or_tty->print_cr(" ---------------------------------------------------------");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 size_t index = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239 size_t limit = MIN2((int) length, 10);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
240 while (index < limit) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 gclog_or_tty->print_cr(" %4d %6.2lf%% %6.2lf",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 index, _summary_surv_rates[index]->avg() * 100.0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 (double) _summary_surv_rates[index]->num());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244 ++index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247 gclog_or_tty->print_cr(" ---------------------------------------------------------");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
248
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
249 int num = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
250 double sum = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
251 int samples = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
252 while (index < length) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
253 ++num;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
254 sum += _summary_surv_rates[index]->avg() * 100.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
255 samples += _summary_surv_rates[index]->num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
256 ++index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
257
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
258 if (index == length || num % 10 == 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
259 gclog_or_tty->print_cr(" %4d .. %4d %6.2lf%% %6.2lf",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
260 (index-1) / 10 * 10, index-1, sum / (double) num,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
261 (double) samples / (double) num);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
262 sum = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
263 num = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
264 samples = 0;
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 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
267
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
268 gclog_or_tty->print_cr(" ---------------------------------------------------------");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
269 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
270 #endif // PRODUCT