annotate src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp @ 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 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_adaptiveSizePolicy.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 elapsedTimer AdaptiveSizePolicy::_minor_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 elapsedTimer AdaptiveSizePolicy::_major_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // The throughput goal is implemented as
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // _throughput_goal = 1 - ( 1 / (1 + gc_cost_ratio))
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // gc_cost_ratio is the ratio
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // application cost / gc cost
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // For example a gc_cost_ratio of 4 translates into a
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // throughput goal of .80
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 AdaptiveSizePolicy::AdaptiveSizePolicy(size_t init_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
38 size_t init_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
39 size_t init_survivor_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 double gc_pause_goal_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 uint gc_cost_ratio) :
a61af66fc99e Initial load
duke
parents:
diff changeset
42 _eden_size(init_eden_size),
a61af66fc99e Initial load
duke
parents:
diff changeset
43 _promo_size(init_promo_size),
a61af66fc99e Initial load
duke
parents:
diff changeset
44 _survivor_size(init_survivor_size),
a61af66fc99e Initial load
duke
parents:
diff changeset
45 _gc_pause_goal_sec(gc_pause_goal_sec),
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _throughput_goal(1.0 - double(1.0 / (1.0 + (double) gc_cost_ratio))),
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
47 _gc_overhead_limit_exceeded(false),
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
48 _print_gc_overhead_limit_would_be_exceeded(false),
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
49 _gc_overhead_limit_count(0),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _latest_minor_mutator_interval_seconds(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _threshold_tolerance_percent(1.0 + ThresholdTolerance/100.0),
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _young_gen_change_for_minor_throughput(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _old_gen_change_for_major_throughput(0) {
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
54 assert(AdaptiveSizePolicyGCTimeLimitThreshold > 0,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
55 "No opportunity to clear SoftReferences before GC overhead limit");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
56 _avg_minor_pause =
a61af66fc99e Initial load
duke
parents:
diff changeset
57 new AdaptivePaddedAverage(AdaptiveTimeWeight, PausePadding);
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _avg_minor_interval = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _avg_minor_gc_cost = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 _avg_major_gc_cost = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 _avg_young_live = new AdaptiveWeightedAverage(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _avg_old_live = new AdaptiveWeightedAverage(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _avg_eden_live = new AdaptiveWeightedAverage(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _avg_survived = new AdaptivePaddedAverage(AdaptiveSizePolicyWeight,
a61af66fc99e Initial load
duke
parents:
diff changeset
67 SurvivorPadding);
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _avg_pretenured = new AdaptivePaddedNoZeroDevAverage(
a61af66fc99e Initial load
duke
parents:
diff changeset
69 AdaptiveSizePolicyWeight,
a61af66fc99e Initial load
duke
parents:
diff changeset
70 SurvivorPadding);
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _minor_pause_old_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
73 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _minor_pause_young_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
75 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _minor_collection_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
77 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _major_collection_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
79 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Start the timers
a61af66fc99e Initial load
duke
parents:
diff changeset
82 _minor_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _young_gen_policy_is_ready = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 bool AdaptiveSizePolicy::tenuring_threshold_change() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 return decrement_tenuring_threshold_for_gc_cost() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
89 increment_tenuring_threshold_for_gc_cost() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
90 decrement_tenuring_threshold_for_survivor_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 void AdaptiveSizePolicy::minor_collection_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Update the interval time
a61af66fc99e Initial load
duke
parents:
diff changeset
95 _minor_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Save most recent collection time
a61af66fc99e Initial load
duke
parents:
diff changeset
97 _latest_minor_mutator_interval_seconds = _minor_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
98 _minor_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
99 _minor_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void AdaptiveSizePolicy::update_minor_pause_young_estimator(
a61af66fc99e Initial load
duke
parents:
diff changeset
103 double minor_pause_in_ms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 double eden_size_in_mbytes = ((double)_eden_size)/((double)M);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _minor_pause_young_estimator->update(eden_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
106 minor_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 void AdaptiveSizePolicy::minor_collection_end(GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Update the pause time.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 _minor_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
114 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 double minor_pause_in_seconds = _minor_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
116 double minor_pause_in_ms = minor_pause_in_seconds * MILLIUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Sample for performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _avg_minor_pause->sample(minor_pause_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Cost of collection (unit-less)
a61af66fc99e Initial load
duke
parents:
diff changeset
122 double collection_cost = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 if ((_latest_minor_mutator_interval_seconds > 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
124 (minor_pause_in_seconds > 0.0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 double interval_in_seconds =
a61af66fc99e Initial load
duke
parents:
diff changeset
126 _latest_minor_mutator_interval_seconds + minor_pause_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 collection_cost =
a61af66fc99e Initial load
duke
parents:
diff changeset
128 minor_pause_in_seconds / interval_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 _avg_minor_gc_cost->sample(collection_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Sample for performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
131 _avg_minor_interval->sample(interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // The policy does not have enough data until at least some
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // minor collections have been done.
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _young_gen_policy_is_ready =
a61af66fc99e Initial load
duke
parents:
diff changeset
137 (_avg_minor_gc_cost->count() >= AdaptiveSizePolicyReadyThreshold);
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Calculate variables used to estimate pause time vs. gen sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
140 double eden_size_in_mbytes = ((double)_eden_size)/((double)M);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 update_minor_pause_young_estimator(minor_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
142 update_minor_pause_old_estimator(minor_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 gclog_or_tty->print("AdaptiveSizePolicy::minor_collection_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
146 "minor gc cost: %f average: %f", collection_cost,
a61af66fc99e Initial load
duke
parents:
diff changeset
147 _avg_minor_gc_cost->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
148 gclog_or_tty->print_cr(" minor pause: %f minor period %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
149 minor_pause_in_ms,
a61af66fc99e Initial load
duke
parents:
diff changeset
150 _latest_minor_mutator_interval_seconds * MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Calculate variable used to estimate collection cost vs. gen sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
154 assert(collection_cost >= 0.0, "Expected to be non-negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
155 _minor_collection_estimator->update(eden_size_in_mbytes, collection_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Interval times use this timer to measure the mutator time.
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Reset the timer after the GC pause.
a61af66fc99e Initial load
duke
parents:
diff changeset
160 _minor_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
161 _minor_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 size_t AdaptiveSizePolicy::eden_increment(size_t cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
165 uint percent_change) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 size_t eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 eden_heap_delta = cur_eden / 100 * percent_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 return eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 size_t AdaptiveSizePolicy::eden_increment(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 return eden_increment(cur_eden, YoungGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 size_t AdaptiveSizePolicy::eden_decrement(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 size_t eden_heap_delta = eden_increment(cur_eden) /
a61af66fc99e Initial load
duke
parents:
diff changeset
177 AdaptiveSizeDecrementScaleFactor;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 size_t AdaptiveSizePolicy::promo_increment(size_t cur_promo,
a61af66fc99e Initial load
duke
parents:
diff changeset
182 uint percent_change) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 size_t promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 promo_heap_delta = cur_promo / 100 * percent_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 return promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 size_t AdaptiveSizePolicy::promo_increment(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 return promo_increment(cur_promo, TenuredGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 size_t AdaptiveSizePolicy::promo_decrement(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 size_t promo_heap_delta = promo_increment(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
194 promo_heap_delta = promo_heap_delta / AdaptiveSizeDecrementScaleFactor;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 return promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 double AdaptiveSizePolicy::time_since_major_gc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 _major_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
200 double result = _major_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
201 _major_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
202 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Linear decay of major gc cost
a61af66fc99e Initial load
duke
parents:
diff changeset
206 double AdaptiveSizePolicy::decaying_major_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 double major_interval = major_gc_interval_average_for_decay();
a61af66fc99e Initial load
duke
parents:
diff changeset
208 double major_gc_cost_average = major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
209 double decayed_major_gc_cost = major_gc_cost_average;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if(time_since_major_gc() > 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 decayed_major_gc_cost = major_gc_cost() *
a61af66fc99e Initial load
duke
parents:
diff changeset
212 (((double) AdaptiveSizeMajorGCDecayTimeScale) * major_interval)
a61af66fc99e Initial load
duke
parents:
diff changeset
213 / time_since_major_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // The decayed cost should always be smaller than the
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // average cost but the vagaries of finite arithmetic could
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // produce a larger value in decayed_major_gc_cost so protect
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // against that.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 return MIN2(major_gc_cost_average, decayed_major_gc_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Use a value of the major gc cost that has been decayed
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // by the factor
a61af66fc99e Initial load
duke
parents:
diff changeset
225 //
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // average-interval-between-major-gc * AdaptiveSizeMajorGCDecayTimeScale /
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // time-since-last-major-gc
a61af66fc99e Initial load
duke
parents:
diff changeset
228 //
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // if the average-interval-between-major-gc * AdaptiveSizeMajorGCDecayTimeScale
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // is less than time-since-last-major-gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 //
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // In cases where there are initial major gc's that
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // are of a relatively high cost but no later major
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // gc's, the total gc cost can remain high because
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // the major gc cost remains unchanged (since there are no major
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // gc's). In such a situation the value of the unchanging
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // major gc cost can keep the mutator throughput below
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // the goal when in fact the major gc cost is becoming diminishingly
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // small. Use the decaying gc cost only to decide whether to
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // adjust for throughput. Using it also to determine the adjustment
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // to be made for throughput also seems reasonable but there is
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // no test case to use to decide if it is the right thing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // don't do it yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 double AdaptiveSizePolicy::decaying_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 double decayed_major_gc_cost = major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 double avg_major_interval = major_gc_interval_average_for_decay();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 if (UseAdaptiveSizeDecayMajorGCCost &&
a61af66fc99e Initial load
duke
parents:
diff changeset
249 (AdaptiveSizeMajorGCDecayTimeScale > 0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
250 (avg_major_interval > 0.00)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 double time_since_last_major_gc = time_since_major_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // Decay the major gc cost?
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (time_since_last_major_gc >
a61af66fc99e Initial load
duke
parents:
diff changeset
255 ((double) AdaptiveSizeMajorGCDecayTimeScale) * avg_major_interval) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // Decay using the time-since-last-major-gc
a61af66fc99e Initial load
duke
parents:
diff changeset
258 decayed_major_gc_cost = decaying_major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 gclog_or_tty->print_cr("\ndecaying_gc_cost: major interval average:"
a61af66fc99e Initial load
duke
parents:
diff changeset
261 " %f time since last major gc: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
262 avg_major_interval, time_since_last_major_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 gclog_or_tty->print_cr(" major gc cost: %f decayed major gc cost: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
264 major_gc_cost(), decayed_major_gc_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 double result = MIN2(1.0, decayed_major_gc_cost + minor_gc_cost());
a61af66fc99e Initial load
duke
parents:
diff changeset
269 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 void AdaptiveSizePolicy::clear_generation_free_space_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 set_change_young_gen_for_min_pauses(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 set_change_old_gen_for_maj_pauses(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 set_change_old_gen_for_throughput(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
278 set_change_young_gen_for_throughput(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 set_decrease_for_footprint(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 set_decide_at_full_gc(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
283 void AdaptiveSizePolicy::check_gc_overhead_limit(
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
284 size_t young_live,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
285 size_t eden_live,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
286 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
287 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
288 bool is_full_gc,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
289 GCCause::Cause gc_cause,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
290 CollectorPolicy* collector_policy) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
291
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
292 // Ignore explicit GC's. Exiting here does not set the flag and
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
293 // does not reset the count. Updating of the averages for system
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
294 // GC's is still controlled by UseAdaptiveSizePolicyWithSystemGC.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
295 if (GCCause::is_user_requested_gc(gc_cause) ||
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
296 GCCause::is_serviceability_requested_gc(gc_cause)) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
297 return;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
298 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
299 // eden_limit is the upper limit on the size of eden based on
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
300 // the maximum size of the young generation and the sizes
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
301 // of the survivor space.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
302 // The question being asked is whether the gc costs are high
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
303 // and the space being recovered by a collection is low.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
304 // free_in_young_gen is the free space in the young generation
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
305 // after a collection and promo_live is the free space in the old
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
306 // generation after a collection.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
307 //
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
308 // Use the minimum of the current value of the live in the
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
309 // young gen or the average of the live in the young gen.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
310 // If the current value drops quickly, that should be taken
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
311 // into account (i.e., don't trigger if the amount of free
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
312 // space has suddenly jumped up). If the current is much
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
313 // higher than the average, use the average since it represents
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
314 // the longer term behavor.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
315 const size_t live_in_eden =
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
316 MIN2(eden_live, (size_t) avg_eden_live()->average());
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
317 const size_t free_in_eden = max_eden_size > live_in_eden ?
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
318 max_eden_size - live_in_eden : 0;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
319 const size_t free_in_old_gen = (size_t)(max_old_gen_size - avg_old_live()->average());
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
320 const size_t total_free_limit = free_in_old_gen + free_in_eden;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
321 const size_t total_mem = max_old_gen_size + max_eden_size;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
322 const double mem_free_limit = total_mem * (GCHeapFreeLimit/100.0);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
323 const double mem_free_old_limit = max_old_gen_size * (GCHeapFreeLimit/100.0);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
324 const double mem_free_eden_limit = max_eden_size * (GCHeapFreeLimit/100.0);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
325 const double gc_cost_limit = GCTimeLimit/100.0;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
326 size_t promo_limit = (size_t)(max_old_gen_size - avg_old_live()->average());
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
327 // But don't force a promo size below the current promo size. Otherwise,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
328 // the promo size will shrink for no good reason.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
329 promo_limit = MAX2(promo_limit, _promo_size);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
330
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
331
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
332 if (PrintAdaptiveSizePolicy && (Verbose ||
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
333 (free_in_old_gen < (size_t) mem_free_old_limit &&
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
334 free_in_eden < (size_t) mem_free_eden_limit))) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
335 gclog_or_tty->print_cr(
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
336 "PSAdaptiveSizePolicy::compute_generation_free_space limits:"
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
337 " promo_limit: " SIZE_FORMAT
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
338 " max_eden_size: " SIZE_FORMAT
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
339 " total_free_limit: " SIZE_FORMAT
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
340 " max_old_gen_size: " SIZE_FORMAT
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
341 " max_eden_size: " SIZE_FORMAT
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
342 " mem_free_limit: " SIZE_FORMAT,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
343 promo_limit, max_eden_size, total_free_limit,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
344 max_old_gen_size, max_eden_size,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
345 (size_t) mem_free_limit);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
346 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
347
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
348 bool print_gc_overhead_limit_would_be_exceeded = false;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
349 if (is_full_gc) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
350 if (gc_cost() > gc_cost_limit &&
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
351 free_in_old_gen < (size_t) mem_free_old_limit &&
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
352 free_in_eden < (size_t) mem_free_eden_limit) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
353 // Collections, on average, are taking too much time, and
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
354 // gc_cost() > gc_cost_limit
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
355 // we have too little space available after a full gc.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
356 // total_free_limit < mem_free_limit
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
357 // where
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
358 // total_free_limit is the free space available in
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
359 // both generations
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
360 // total_mem is the total space available for allocation
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
361 // in both generations (survivor spaces are not included
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
362 // just as they are not included in eden_limit).
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
363 // mem_free_limit is a fraction of total_mem judged to be an
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
364 // acceptable amount that is still unused.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
365 // The heap can ask for the value of this variable when deciding
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
366 // whether to thrown an OutOfMemory error.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
367 // Note that the gc time limit test only works for the collections
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
368 // of the young gen + tenured gen and not for collections of the
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
369 // permanent gen. That is because the calculation of the space
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
370 // freed by the collection is the free space in the young gen +
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
371 // tenured gen.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
372 // At this point the GC overhead limit is being exceeded.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
373 inc_gc_overhead_limit_count();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
374 if (UseGCOverheadLimit) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
375 if (gc_overhead_limit_count() >=
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
376 AdaptiveSizePolicyGCTimeLimitThreshold){
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
377 // All conditions have been met for throwing an out-of-memory
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
378 set_gc_overhead_limit_exceeded(true);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
379 // Avoid consecutive OOM due to the gc time limit by resetting
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
380 // the counter.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
381 reset_gc_overhead_limit_count();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
382 } else {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
383 // The required consecutive collections which exceed the
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
384 // GC time limit may or may not have been reached. We
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
385 // are approaching that condition and so as not to
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
386 // throw an out-of-memory before all SoftRef's have been
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
387 // cleared, set _should_clear_all_soft_refs in CollectorPolicy.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
388 // The clearing will be done on the next GC.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
389 bool near_limit = gc_overhead_limit_near();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
390 if (near_limit) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
391 collector_policy->set_should_clear_all_soft_refs(true);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
392 if (PrintGCDetails && Verbose) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
393 gclog_or_tty->print_cr(" Nearing GC overhead limit, "
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
394 "will be clearing all SoftReference");
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
395 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
396 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
397 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
398 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
399 // Set this even when the overhead limit will not
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
400 // cause an out-of-memory. Diagnostic message indicating
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
401 // that the overhead limit is being exceeded is sometimes
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
402 // printed.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
403 print_gc_overhead_limit_would_be_exceeded = true;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
404
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
405 } else {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
406 // Did not exceed overhead limits
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
407 reset_gc_overhead_limit_count();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
408 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
409 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
410
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
411 if (UseGCOverheadLimit && PrintGCDetails && Verbose) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
412 if (gc_overhead_limit_exceeded()) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
413 gclog_or_tty->print_cr(" GC is exceeding overhead limit "
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
414 "of %d%%", GCTimeLimit);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
415 reset_gc_overhead_limit_count();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
416 } else if (print_gc_overhead_limit_would_be_exceeded) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
417 assert(gc_overhead_limit_count() > 0, "Should not be printing");
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
418 gclog_or_tty->print_cr(" GC would exceed overhead limit "
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
419 "of %d%% %d consecutive time(s)",
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
420 GCTimeLimit, gc_overhead_limit_count());
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
421 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
422 }
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
423 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 bool AdaptiveSizePolicy::print_adaptive_size_policy_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Should only be used with adaptive size policy turned on.
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // Otherwise, there may be variables that are undefined.
a61af66fc99e Initial load
duke
parents:
diff changeset
430 if (!UseAdaptiveSizePolicy) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // Print goal for which action is needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
433 char* action = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
434 bool change_for_pause = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 if ((change_old_gen_for_maj_pauses() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
436 decrease_old_gen_for_maj_pauses_true) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
437 (change_young_gen_for_min_pauses() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
438 decrease_young_gen_for_min_pauses_true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 action = (char*) " *** pause time goal ***";
a61af66fc99e Initial load
duke
parents:
diff changeset
440 change_for_pause = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 } else if ((change_old_gen_for_throughput() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
442 increase_old_gen_for_throughput_true) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
443 (change_young_gen_for_throughput() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
444 increase_young_gen_for_througput_true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 action = (char*) " *** throughput goal ***";
a61af66fc99e Initial load
duke
parents:
diff changeset
446 } else if (decrease_for_footprint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 action = (char*) " *** reduced footprint ***";
a61af66fc99e Initial load
duke
parents:
diff changeset
448 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // No actions were taken. This can legitimately be the
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // situation if not enough data has been gathered to make
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // decisions.
a61af66fc99e Initial load
duke
parents:
diff changeset
452 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Pauses
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Currently the size of the old gen is only adjusted to
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // change the major pause times.
a61af66fc99e Initial load
duke
parents:
diff changeset
458 char* young_gen_action = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
459 char* tenured_gen_action = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 char* shrink_msg = (char*) "(attempted to shrink)";
a61af66fc99e Initial load
duke
parents:
diff changeset
462 char* grow_msg = (char*) "(attempted to grow)";
a61af66fc99e Initial load
duke
parents:
diff changeset
463 char* no_change_msg = (char*) "(no change)";
a61af66fc99e Initial load
duke
parents:
diff changeset
464 if (change_young_gen_for_min_pauses() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
465 decrease_young_gen_for_min_pauses_true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 young_gen_action = shrink_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 } else if (change_for_pause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 young_gen_action = no_change_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 if (change_old_gen_for_maj_pauses() == decrease_old_gen_for_maj_pauses_true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 tenured_gen_action = shrink_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 } else if (change_for_pause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 tenured_gen_action = no_change_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // Throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (change_old_gen_for_throughput() == increase_old_gen_for_throughput_true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 assert(change_young_gen_for_throughput() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
480 increase_young_gen_for_througput_true,
a61af66fc99e Initial load
duke
parents:
diff changeset
481 "Both generations should be growing");
a61af66fc99e Initial load
duke
parents:
diff changeset
482 young_gen_action = grow_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 tenured_gen_action = grow_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
484 } else if (change_young_gen_for_throughput() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
485 increase_young_gen_for_througput_true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // Only the young generation may grow at start up (before
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // enough full collections have been done to grow the old generation).
a61af66fc99e Initial load
duke
parents:
diff changeset
488 young_gen_action = grow_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 tenured_gen_action = no_change_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // Minimum footprint
a61af66fc99e Initial load
duke
parents:
diff changeset
493 if (decrease_for_footprint() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 young_gen_action = shrink_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
495 tenured_gen_action = shrink_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 st->print_cr(" UseAdaptiveSizePolicy actions to meet %s", action);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 st->print_cr(" GC overhead (%%)");
a61af66fc99e Initial load
duke
parents:
diff changeset
500 st->print_cr(" Young generation: %7.2f\t %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
501 100.0 * avg_minor_gc_cost()->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
502 young_gen_action);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 st->print_cr(" Tenured generation: %7.2f\t %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
504 100.0 * avg_major_gc_cost()->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
505 tenured_gen_action);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 bool AdaptiveSizePolicy::print_adaptive_size_policy_on(
a61af66fc99e Initial load
duke
parents:
diff changeset
510 outputStream* st,
a61af66fc99e Initial load
duke
parents:
diff changeset
511 int tenuring_threshold_arg) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 if (!AdaptiveSizePolicy::print_adaptive_size_policy_on(st)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // Tenuring threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
517 bool tenuring_threshold_changed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 if (decrement_tenuring_threshold_for_survivor_limit()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
519 st->print(" Tenuring threshold: (attempted to decrease to avoid"
a61af66fc99e Initial load
duke
parents:
diff changeset
520 " survivor space overflow) = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
521 } else if (decrement_tenuring_threshold_for_gc_cost()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 st->print(" Tenuring threshold: (attempted to decrease to balance"
a61af66fc99e Initial load
duke
parents:
diff changeset
523 " GC costs) = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
524 } else if (increment_tenuring_threshold_for_gc_cost()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 st->print(" Tenuring threshold: (attempted to increase to balance"
a61af66fc99e Initial load
duke
parents:
diff changeset
526 " GC costs) = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
527 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 tenuring_threshold_changed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
529 assert(!tenuring_threshold_change(), "(no change was attempted)");
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if (tenuring_threshold_changed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 st->print_cr("%d", tenuring_threshold_arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
534 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }