annotate src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
diff changeset
2 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
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: 1387
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // This class keeps statistical information and computes the
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // size of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // Forward decls
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class elapsedTimer;
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
30 class CollectorPolicy;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class AdaptiveSizePolicy : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 friend class GCAdaptivePolicyCounters;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 friend class PSGCAdaptivePolicyCounters;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 friend class CMSGCAdaptivePolicyCounters;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 enum GCPolicyKind {
a61af66fc99e Initial load
duke
parents:
diff changeset
39 _gc_adaptive_size_policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 _gc_ps_adaptive_size_policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 _gc_cms_adaptive_size_policy
a61af66fc99e Initial load
duke
parents:
diff changeset
42 };
a61af66fc99e Initial load
duke
parents:
diff changeset
43 virtual GCPolicyKind kind() const { return _gc_adaptive_size_policy; }
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 enum SizePolicyTrueValues {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 decrease_old_gen_for_throughput_true = -7,
a61af66fc99e Initial load
duke
parents:
diff changeset
47 decrease_young_gen_for_througput_true = -6,
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 increase_old_gen_for_min_pauses_true = -5,
a61af66fc99e Initial load
duke
parents:
diff changeset
50 decrease_old_gen_for_min_pauses_true = -4,
a61af66fc99e Initial load
duke
parents:
diff changeset
51 decrease_young_gen_for_maj_pauses_true = -3,
a61af66fc99e Initial load
duke
parents:
diff changeset
52 increase_young_gen_for_min_pauses_true = -2,
a61af66fc99e Initial load
duke
parents:
diff changeset
53 increase_old_gen_for_maj_pauses_true = -1,
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 decrease_young_gen_for_min_pauses_true = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
56 decrease_old_gen_for_maj_pauses_true = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
57 increase_young_gen_for_maj_pauses_true = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 increase_old_gen_for_throughput_true = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
60 increase_young_gen_for_througput_true = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 decrease_young_gen_for_footprint_true = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
63 decrease_old_gen_for_footprint_true = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
64 decide_at_full_gc_true = 8
a61af66fc99e Initial load
duke
parents:
diff changeset
65 };
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // Goal for the fraction of the total time during which application
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // threads run.
a61af66fc99e Initial load
duke
parents:
diff changeset
69 const double _throughput_goal;
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Last calculated sizes, in bytes, and aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
72 size_t _eden_size; // calculated eden free space in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
73 size_t _promo_size; // calculated cms gen free space in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 size_t _survivor_size; // calculated survivor size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // This is a hint for the heap: we've detected that gc times
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // are taking longer than GCTimeLimit allows.
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
79 bool _gc_overhead_limit_exceeded;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
80 // Use for diagnostics only. If UseGCOverheadLimit is false,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // this variable is still set.
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
82 bool _print_gc_overhead_limit_would_be_exceeded;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Count of consecutive GC that have exceeded the
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // GC time limit criterion.
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
85 uint _gc_overhead_limit_count;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
86 // This flag signals that GCTimeLimit is being exceeded
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
87 // but may not have done so for the required number of consequetive
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
88 // collections.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Minor collection timers used to determine both
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // pause and interval times for collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 static elapsedTimer _minor_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Major collection timers, used to determine both
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // pause and interval times for collections
a61af66fc99e Initial load
duke
parents:
diff changeset
96 static elapsedTimer _major_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Time statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
99 AdaptivePaddedAverage* _avg_minor_pause;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 AdaptiveWeightedAverage* _avg_minor_interval;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 AdaptiveWeightedAverage* _avg_minor_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 AdaptiveWeightedAverage* _avg_major_interval;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 AdaptiveWeightedAverage* _avg_major_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Footprint statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
107 AdaptiveWeightedAverage* _avg_young_live;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 AdaptiveWeightedAverage* _avg_eden_live;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 AdaptiveWeightedAverage* _avg_old_live;
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // Statistics for survivor space calculation for young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
112 AdaptivePaddedAverage* _avg_survived;
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Objects that have been directly allocated in the old generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
115 AdaptivePaddedNoZeroDevAverage* _avg_pretenured;
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Variable for estimating the major and minor pause times.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // These variables represent linear least-squares fits of
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // the data.
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // minor pause time vs. old gen size
a61af66fc99e Initial load
duke
parents:
diff changeset
121 LinearLeastSquareFit* _minor_pause_old_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // minor pause time vs. young gen size
a61af66fc99e Initial load
duke
parents:
diff changeset
123 LinearLeastSquareFit* _minor_pause_young_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Variables for estimating the major and minor collection costs
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // minor collection time vs. young gen size
a61af66fc99e Initial load
duke
parents:
diff changeset
127 LinearLeastSquareFit* _minor_collection_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // major collection time vs. cms gen size
a61af66fc99e Initial load
duke
parents:
diff changeset
129 LinearLeastSquareFit* _major_collection_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // These record the most recent collection times. They
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // are available as an alternative to using the averages
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // for making ergonomic decisions.
a61af66fc99e Initial load
duke
parents:
diff changeset
134 double _latest_minor_mutator_interval_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Allowed difference between major and minor gc times, used
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // for computing tenuring_threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
138 const double _threshold_tolerance_percent;
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 const double _gc_pause_goal_sec; // goal for maximum gc pause
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Flag indicating that the adaptive policy is ready to use
a61af66fc99e Initial load
duke
parents:
diff changeset
143 bool _young_gen_policy_is_ready;
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // decrease/increase the young generation for minor pause time
a61af66fc99e Initial load
duke
parents:
diff changeset
146 int _change_young_gen_for_min_pauses;
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // decrease/increase the old generation for major pause time
a61af66fc99e Initial load
duke
parents:
diff changeset
149 int _change_old_gen_for_maj_pauses;
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // change old geneneration for throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
152 int _change_old_gen_for_throughput;
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // change young generation for throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
155 int _change_young_gen_for_throughput;
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Flag indicating that the policy would
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // increase the tenuring threshold because of the total major gc cost
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // is greater than the total minor gc cost
a61af66fc99e Initial load
duke
parents:
diff changeset
160 bool _increment_tenuring_threshold_for_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // decrease the tenuring threshold because of the the total minor gc
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // cost is greater than the total major gc cost
a61af66fc99e Initial load
duke
parents:
diff changeset
163 bool _decrement_tenuring_threshold_for_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // decrease due to survivor size limit
a61af66fc99e Initial load
duke
parents:
diff changeset
165 bool _decrement_tenuring_threshold_for_survivor_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // decrease generation sizes for footprint
a61af66fc99e Initial load
duke
parents:
diff changeset
168 int _decrease_for_footprint;
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Set if the ergonomic decisions were made at a full GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 int _decide_at_full_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Changing the generation sizing depends on the data that is
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // gathered about the effects of changes on the pause times and
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // throughput. These variable count the number of data points
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // gathered. The policy may use these counters as a threshhold
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // for reliable data.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 julong _young_gen_change_for_minor_throughput;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 julong _old_gen_change_for_major_throughput;
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 double gc_pause_goal_sec() const { return _gc_pause_goal_sec; }
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // The value returned is unitless: it's the proportion of time
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // spent in a particular collection type.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // An interval time will be 0.0 if a collection type hasn't occurred yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // The 1.4.2 implementation put a floor on the values of major_gc_cost
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // and minor_gc_cost. This was useful because of the way major_gc_cost
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // and minor_gc_cost was used in calculating the sizes of the generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // Do not use a floor in this implementation because any finite value
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // will put a limit on the throughput that can be achieved and any
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // throughput goal above that limit will drive the generations sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // to extremes.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 double major_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 return MAX2(0.0F, _avg_major_gc_cost->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // The value returned is unitless: it's the proportion of time
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // spent in a particular collection type.
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // An interval time will be 0.0 if a collection type hasn't occurred yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // The 1.4.2 implementation put a floor on the values of major_gc_cost
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // and minor_gc_cost. This was useful because of the way major_gc_cost
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // and minor_gc_cost was used in calculating the sizes of the generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // Do not use a floor in this implementation because any finite value
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // will put a limit on the throughput that can be achieved and any
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // throughput goal above that limit will drive the generations sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // to extremes.
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 double minor_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return MAX2(0.0F, _avg_minor_gc_cost->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Because we're dealing with averages, gc_cost() can be
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // larger than 1.0 if just the sum of the minor cost the
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // the major cost is used. Worse than that is the
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // fact that the minor cost and the major cost each
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // tend toward 1.0 in the extreme of high gc costs.
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Limit the value of gc_cost to 1.0 so that the mutator
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // cost stays non-negative.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 virtual double gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 double result = MIN2(1.0, minor_gc_cost() + major_gc_cost());
a61af66fc99e Initial load
duke
parents:
diff changeset
222 assert(result >= 0.0, "Both minor and major costs are non-negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
223 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Elapsed time since the last major collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
227 virtual double time_since_major_gc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Average interval between major collections to be used
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // in calculating the decaying major gc cost. An overestimate
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // of this time would be a conservative estimate because
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // this time is used to decide if the major GC cost
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // should be decayed (i.e., if the time since the last
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // major gc is long compared to the time returned here,
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // then the major GC cost will be decayed). See the
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // implementations for the specifics.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 virtual double major_gc_interval_average_for_decay() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return _avg_major_interval->average();
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Return the cost of the GC where the major gc cost
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // has been decayed based on the time since the last
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // major collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 double decaying_gc_cost() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // Decay the major gc cost. Use this only for decisions on
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // whether to adjust, not to determine by how much to adjust.
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // This approximation is crude and may not be good enough for the
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // latter.
a61af66fc99e Initial load
duke
parents:
diff changeset
250 double decaying_major_gc_cost() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Return the mutator cost using the decayed
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // GC cost.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 double adjusted_mutator_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 double result = 1.0 - decaying_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 assert(result >= 0.0, "adjusted mutator cost calculation is incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
257 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 virtual double mutator_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 double result = 1.0 - gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
262 assert(result >= 0.0, "mutator cost calculation is incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
263 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 bool young_gen_policy_is_ready() { return _young_gen_policy_is_ready; }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void update_minor_pause_young_estimator(double minor_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 virtual void update_minor_pause_old_estimator(double minor_pause_in_ms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // This is not meaningful for all policies but needs to be present
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // to use minor_collection_end() in its current form.
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 virtual size_t eden_increment(size_t cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 virtual size_t eden_increment(size_t cur_eden, uint percent_change);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 virtual size_t eden_decrement(size_t cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
278 virtual size_t promo_increment(size_t cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 virtual size_t promo_increment(size_t cur_eden, uint percent_change);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 virtual size_t promo_decrement(size_t cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 virtual void clear_generation_free_space_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 int change_old_gen_for_throughput() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 return _change_old_gen_for_throughput;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 void set_change_old_gen_for_throughput(int v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 _change_old_gen_for_throughput = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 int change_young_gen_for_throughput() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 return _change_young_gen_for_throughput;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void set_change_young_gen_for_throughput(int v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 _change_young_gen_for_throughput = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 int change_old_gen_for_maj_pauses() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 return _change_old_gen_for_maj_pauses;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void set_change_old_gen_for_maj_pauses(int v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 _change_old_gen_for_maj_pauses = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 bool decrement_tenuring_threshold_for_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 return _decrement_tenuring_threshold_for_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 void set_decrement_tenuring_threshold_for_gc_cost(bool v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 _decrement_tenuring_threshold_for_gc_cost = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 bool increment_tenuring_threshold_for_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return _increment_tenuring_threshold_for_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void set_increment_tenuring_threshold_for_gc_cost(bool v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 _increment_tenuring_threshold_for_gc_cost = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 bool decrement_tenuring_threshold_for_survivor_limit() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 return _decrement_tenuring_threshold_for_survivor_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 void set_decrement_tenuring_threshold_for_survivor_limit(bool v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 _decrement_tenuring_threshold_for_survivor_limit = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // Return true if the policy suggested a change.
a61af66fc99e Initial load
duke
parents:
diff changeset
323 bool tenuring_threshold_change() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
326 AdaptiveSizePolicy(size_t init_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
327 size_t init_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
328 size_t init_survivor_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
329 double gc_pause_goal_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
330 uint gc_cost_ratio);
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 bool is_gc_cms_adaptive_size_policy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 return kind() == _gc_cms_adaptive_size_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335 bool is_gc_ps_adaptive_size_policy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 return kind() == _gc_ps_adaptive_size_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 AdaptivePaddedAverage* avg_minor_pause() const { return _avg_minor_pause; }
a61af66fc99e Initial load
duke
parents:
diff changeset
340 AdaptiveWeightedAverage* avg_minor_interval() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return _avg_minor_interval;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 AdaptiveWeightedAverage* avg_minor_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 return _avg_minor_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 AdaptiveWeightedAverage* avg_major_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 return _avg_major_gc_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 AdaptiveWeightedAverage* avg_young_live() const { return _avg_young_live; }
a61af66fc99e Initial load
duke
parents:
diff changeset
352 AdaptiveWeightedAverage* avg_eden_live() const { return _avg_eden_live; }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 AdaptiveWeightedAverage* avg_old_live() const { return _avg_old_live; }
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 AdaptivePaddedAverage* avg_survived() const { return _avg_survived; }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 AdaptivePaddedNoZeroDevAverage* avg_pretenured() { return _avg_pretenured; }
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // Methods indicating events of interest to the adaptive size policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // called by GC algorithms. It is the responsibility of users of this
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // policy to call these methods at the correct times!
a61af66fc99e Initial load
duke
parents:
diff changeset
361 virtual void minor_collection_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
362 virtual void minor_collection_end(GCCause::Cause gc_cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 virtual LinearLeastSquareFit* minor_pause_old_estimator() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 return _minor_pause_old_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 LinearLeastSquareFit* minor_pause_young_estimator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 return _minor_pause_young_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 LinearLeastSquareFit* minor_collection_estimator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 return _minor_collection_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 LinearLeastSquareFit* major_collection_estimator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 return _major_collection_estimator;
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 float minor_pause_young_slope() {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 return _minor_pause_young_estimator->slope();
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 float minor_collection_slope() { return _minor_collection_estimator->slope();}
a61af66fc99e Initial load
duke
parents:
diff changeset
383 float major_collection_slope() { return _major_collection_estimator->slope();}
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 float minor_pause_old_slope() {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 return _minor_pause_old_estimator->slope();
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 void set_eden_size(size_t new_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 _eden_size = new_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392 void set_survivor_size(size_t new_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 _survivor_size = new_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 size_t calculated_eden_size_in_bytes() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
397 return _eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 size_t calculated_promo_size_in_bytes() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 return _promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 size_t calculated_survivor_size_in_bytes() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 return _survivor_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // This is a hint for the heap: we've detected that gc times
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // are taking longer than GCTimeLimit allows.
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Most heaps will choose to throw an OutOfMemoryError when
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // this occurs but it is up to the heap to request this information
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // of the policy
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
413 bool gc_overhead_limit_exceeded() {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
414 return _gc_overhead_limit_exceeded;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
415 }
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
416 void set_gc_overhead_limit_exceeded(bool v) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
417 _gc_overhead_limit_exceeded = v;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
419
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
420 // Tests conditions indicate the GC overhead limit is being approached.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
421 bool gc_overhead_limit_near() {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
422 return gc_overhead_limit_count() >=
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
423 (AdaptiveSizePolicyGCTimeLimitThreshold - 1);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
424 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
425 uint gc_overhead_limit_count() { return _gc_overhead_limit_count; }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
426 void reset_gc_overhead_limit_count() { _gc_overhead_limit_count = 0; }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
427 void inc_gc_overhead_limit_count() { _gc_overhead_limit_count++; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // accessors for flags recording the decisions to resize the
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // generations to meet the pause goal.
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 int change_young_gen_for_min_pauses() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 return _change_young_gen_for_min_pauses;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 void set_change_young_gen_for_min_pauses(int v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 _change_young_gen_for_min_pauses = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437 void set_decrease_for_footprint(int v) { _decrease_for_footprint = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 int decrease_for_footprint() const { return _decrease_for_footprint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 int decide_at_full_gc() { return _decide_at_full_gc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
440 void set_decide_at_full_gc(int v) { _decide_at_full_gc = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
442 // Check the conditions for an out-of-memory due to excessive GC time.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
443 // Set _gc_overhead_limit_exceeded if all the conditions have been met.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
444 void check_gc_overhead_limit(size_t young_live,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
445 size_t eden_live,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
446 size_t max_old_gen_size,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
447 size_t max_eden_size,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
448 bool is_full_gc,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
449 GCCause::Cause gc_cause,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
450 CollectorPolicy* collector_policy);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
451
0
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // Printing support
a61af66fc99e Initial load
duke
parents:
diff changeset
453 virtual bool print_adaptive_size_policy_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 bool print_adaptive_size_policy_on(outputStream* st, int
a61af66fc99e Initial load
duke
parents:
diff changeset
455 tenuring_threshold) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
456 };
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // Class that can be used to print information about the
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // adaptive size policy at intervals specified by
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // AdaptiveSizePolicyOutputInterval. Only print information
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // if an adaptive size policy is in use.
a61af66fc99e Initial load
duke
parents:
diff changeset
462 class AdaptiveSizePolicyOutput : StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 AdaptiveSizePolicy* _size_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
464 bool _do_print;
a61af66fc99e Initial load
duke
parents:
diff changeset
465 bool print_test(uint count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // A count of zero is a special value that indicates that the
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // interval test should be ignored. An interval is of zero is
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // a special value that indicates that the interval test should
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // always fail (never do the print based on the interval test).
a61af66fc99e Initial load
duke
parents:
diff changeset
470 return PrintGCDetails &&
a61af66fc99e Initial load
duke
parents:
diff changeset
471 UseAdaptiveSizePolicy &&
a61af66fc99e Initial load
duke
parents:
diff changeset
472 (UseParallelGC || UseConcMarkSweepGC) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
473 (AdaptiveSizePolicyOutputInterval > 0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
474 ((count == 0) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
475 ((count % AdaptiveSizePolicyOutputInterval) == 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // The special value of a zero count can be used to ignore
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // the count test.
a61af66fc99e Initial load
duke
parents:
diff changeset
480 AdaptiveSizePolicyOutput(uint count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 if (UseAdaptiveSizePolicy && (AdaptiveSizePolicyOutputInterval > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 CollectedHeap* heap = Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
483 _size_policy = heap->size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
484 _do_print = print_test(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
485 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 _size_policy = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 _do_print = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 AdaptiveSizePolicyOutput(AdaptiveSizePolicy* size_policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
491 uint count) :
a61af66fc99e Initial load
duke
parents:
diff changeset
492 _size_policy(size_policy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
493 if (UseAdaptiveSizePolicy && (AdaptiveSizePolicyOutputInterval > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 _do_print = print_test(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 _do_print = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 ~AdaptiveSizePolicyOutput() {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 if (_do_print) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 assert(UseAdaptiveSizePolicy, "Should not be in use");
a61af66fc99e Initial load
duke
parents:
diff changeset
502 _size_policy->print_adaptive_size_policy_on(gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
505 };