annotate src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp @ 453:c96030fff130

6684579: SoftReference processing can be made more efficient Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not. Reviewed-by: jmasa
author ysr
date Thu, 20 Nov 2008 16:56:09 -0800
parents a61af66fc99e
children 0bfd3fb24150
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved.
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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
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 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_psAdaptiveSizePolicy.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 #include <math.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 PSAdaptiveSizePolicy::PSAdaptiveSizePolicy(size_t init_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
31 size_t init_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
32 size_t init_survivor_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
33 size_t intra_generation_alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
34 double gc_pause_goal_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
35 double gc_minor_pause_goal_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
36 uint gc_cost_ratio) :
a61af66fc99e Initial load
duke
parents:
diff changeset
37 AdaptiveSizePolicy(init_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
38 init_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
39 init_survivor_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 gc_pause_goal_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 gc_cost_ratio),
a61af66fc99e Initial load
duke
parents:
diff changeset
42 _collection_cost_margin_fraction(AdaptiveSizePolicyCollectionCostMargin/
a61af66fc99e Initial load
duke
parents:
diff changeset
43 100.0),
a61af66fc99e Initial load
duke
parents:
diff changeset
44 _intra_generation_alignment(intra_generation_alignment),
a61af66fc99e Initial load
duke
parents:
diff changeset
45 _live_at_last_full_gc(init_promo_size),
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _gc_minor_pause_goal_sec(gc_minor_pause_goal_sec),
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _latest_major_mutator_interval_seconds(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _young_gen_change_for_major_pause_count(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
49 {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Sizing policy statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _avg_major_pause =
a61af66fc99e Initial load
duke
parents:
diff changeset
52 new AdaptivePaddedAverage(AdaptiveTimeWeight, PausePadding);
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _avg_minor_interval = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
54 _avg_major_interval = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 _avg_base_footprint = new AdaptiveWeightedAverage(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _major_pause_old_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
58 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _major_pause_young_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
60 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
61 _major_collection_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
62 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _young_gen_size_increment_supplement = YoungGenerationSizeSupplement;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 _old_gen_size_increment_supplement = TenuredGenerationSizeSupplement;
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // Start the timers
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _major_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _old_gen_policy_is_ready = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void PSAdaptiveSizePolicy::major_collection_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // Update the interval time
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _major_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // Save most recent collection time
a61af66fc99e Initial load
duke
parents:
diff changeset
77 _latest_major_mutator_interval_seconds = _major_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _major_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _major_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 void PSAdaptiveSizePolicy::update_minor_pause_old_estimator(
a61af66fc99e Initial load
duke
parents:
diff changeset
83 double minor_pause_in_ms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 double promo_size_in_mbytes = ((double)_promo_size)/((double)M);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _minor_pause_old_estimator->update(promo_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
86 minor_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 void PSAdaptiveSizePolicy::major_collection_end(size_t amount_live,
a61af66fc99e Initial load
duke
parents:
diff changeset
90 GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // Update the pause time.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 _major_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
95 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 double major_pause_in_seconds = _major_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 double major_pause_in_ms = major_pause_in_seconds * MILLIUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // Sample for performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
100 _avg_major_pause->sample(major_pause_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Cost of collection (unit-less)
a61af66fc99e Initial load
duke
parents:
diff changeset
103 double collection_cost = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 if ((_latest_major_mutator_interval_seconds > 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
105 (major_pause_in_seconds > 0.0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 double interval_in_seconds =
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _latest_major_mutator_interval_seconds + major_pause_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 collection_cost =
a61af66fc99e Initial load
duke
parents:
diff changeset
109 major_pause_in_seconds / interval_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 avg_major_gc_cost()->sample(collection_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Sample for performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
113 _avg_major_interval->sample(interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Calculate variables used to estimate pause time vs. gen sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
117 double eden_size_in_mbytes = ((double)_eden_size)/((double)M);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 double promo_size_in_mbytes = ((double)_promo_size)/((double)M);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _major_pause_old_estimator->update(promo_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
120 major_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 _major_pause_young_estimator->update(eden_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
122 major_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 gclog_or_tty->print("psAdaptiveSizePolicy::major_collection_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
126 "major gc cost: %f average: %f", collection_cost,
a61af66fc99e Initial load
duke
parents:
diff changeset
127 avg_major_gc_cost()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
128 gclog_or_tty->print_cr(" major pause: %f major period %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
129 major_pause_in_ms,
a61af66fc99e Initial load
duke
parents:
diff changeset
130 _latest_major_mutator_interval_seconds * MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // Calculate variable used to estimate collection cost vs. gen sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
134 assert(collection_cost >= 0.0, "Expected to be non-negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _major_collection_estimator->update(promo_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 collection_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Update the amount live at the end of a full GC
a61af66fc99e Initial load
duke
parents:
diff changeset
140 _live_at_last_full_gc = amount_live;
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // The policy does not have enough data until at least some major collections
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // have been done.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (_avg_major_pause->count() >= AdaptiveSizePolicyReadyThreshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 _old_gen_policy_is_ready = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Interval times use this timer to measure the interval that
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // the mutator runs. Reset after the GC pause has been measured.
a61af66fc99e Initial load
duke
parents:
diff changeset
150 _major_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 _major_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // If the remaining free space in the old generation is less that
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // that expected to be needed by the next collection, do a full
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // collection now.
a61af66fc99e Initial load
duke
parents:
diff changeset
157 bool PSAdaptiveSizePolicy::should_full_GC(size_t old_free_in_bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // A similar test is done in the scavenge's should_attempt_scavenge(). If
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // this is changed, decide if that test should also be changed.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 bool result = padded_average_promoted_in_bytes() > (float) old_free_in_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 if (result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 gclog_or_tty->print(" full after scavenge: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
165 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 gclog_or_tty->print(" no full after scavenge: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168 gclog_or_tty->print_cr(" average_promoted " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
169 " padded_average_promoted " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
170 " free in old gen " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
171 (size_t) average_promoted_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
172 (size_t) padded_average_promoted_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
173 old_free_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 void PSAdaptiveSizePolicy::clear_generation_free_space_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 AdaptiveSizePolicy::clear_generation_free_space_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 set_change_old_gen_for_min_pauses(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 set_change_young_gen_for_maj_pauses(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // If this is not a full GC, only test and modify the young generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 void PSAdaptiveSizePolicy::compute_generation_free_space(size_t young_live,
a61af66fc99e Initial load
duke
parents:
diff changeset
191 size_t eden_live,
a61af66fc99e Initial load
duke
parents:
diff changeset
192 size_t old_live,
a61af66fc99e Initial load
duke
parents:
diff changeset
193 size_t perm_live,
a61af66fc99e Initial load
duke
parents:
diff changeset
194 size_t cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
195 size_t max_old_gen_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
196 size_t max_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
197 bool is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
198 GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Update statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // Time statistics are updated as we go, update footprint stats here
a61af66fc99e Initial load
duke
parents:
diff changeset
202 _avg_base_footprint->sample(BaseFootPrintEstimate + perm_live);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 avg_young_live()->sample(young_live);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 avg_eden_live()->sample(eden_live);
a61af66fc99e Initial load
duke
parents:
diff changeset
205 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // old_live is only accurate after a full gc
a61af66fc99e Initial load
duke
parents:
diff changeset
207 avg_old_live()->sample(old_live);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // This code used to return if the policy was not ready , i.e.,
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // policy_is_ready() returning false. The intent was that
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // decisions below needed major collection times and so could
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // not be made before two major collections. A consequence was
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // adjustments to the young generation were not done until after
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // two major collections even if the minor collections times
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // exceeded the requested goals. Now let the young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // adjust for the minor collection times. Major collection times
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // will be zero for the first collection and will naturally be
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // ignored. Tenured generation adjustments are only made at the
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // full collections so until the second major collection has
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // been reached, no tenured generation adjustments will be made.
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Until we know better, desired promotion size uses the last calculation
a61af66fc99e Initial load
duke
parents:
diff changeset
224 size_t desired_promo_size = _promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Start eden at the current value. The desired value that is stored
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // in _eden_size is not bounded by constraints of the heap and can
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // run away.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 //
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // As expected setting desired_eden_size to the current
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // value of desired_eden_size as a starting point
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // caused desired_eden_size to grow way too large and caused
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // an overflow down stream. It may have improved performance in
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // some case but is dangerous.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 size_t desired_eden_size = cur_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
238 size_t original_promo_size = desired_promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 size_t original_eden_size = desired_eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Cache some values. There's a bit of work getting these, so
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // we might save a little time.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 const double major_cost = major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 const double minor_cost = minor_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Used for diagnostics
a61af66fc99e Initial load
duke
parents:
diff changeset
248 clear_generation_free_space_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Limits on our growth
a61af66fc99e Initial load
duke
parents:
diff changeset
251 size_t promo_limit = (size_t)(max_old_gen_size - avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // This method sets the desired eden size. That plus the
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // desired survivor space sizes sets the desired young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // size. This methods does not know what the desired survivor
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // size is but expects that other policy will attempt to make
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // the survivor sizes compatible with the live data in the
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // young generation. This limit is an estimate of the space left
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // in the young generation after the survivor spaces have been
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // subtracted out.
a61af66fc99e Initial load
duke
parents:
diff changeset
261 size_t eden_limit = max_eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // But don't force a promo size below the current promo size. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // the promo size will shrink for no good reason.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 promo_limit = MAX2(promo_limit, _promo_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 const double gc_cost_limit = GCTimeLimit/100.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Which way should we go?
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // if pause requirement is not met
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // adjust size of any generation with average paus exceeding
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // the pause limit. Adjust one pause at a time (the larger)
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // and only make adjustments for the major pause at full collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // else if throughput requirement not met
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // adjust the size of the generation with larger gc time. Only
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // adjust one generation at a time.
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // else
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // adjust down the total heap size. Adjust down the larger of the
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // Add some checks for a threshhold for a change. For example,
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // a change less than the necessary alignment is probably not worth
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // attempting.
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 if ((_avg_minor_pause->padded_average() > gc_pause_goal_sec()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
287 (_avg_major_pause->padded_average() > gc_pause_goal_sec())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 //
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // Check pauses
a61af66fc99e Initial load
duke
parents:
diff changeset
290 //
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Make changes only to affect one of the pauses (the larger)
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // at a time.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 adjust_for_pause_time(is_full_gc, &desired_promo_size, &desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 } else if (_avg_minor_pause->padded_average() > gc_minor_pause_goal_sec()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Adjust only for the minor pause time goal
a61af66fc99e Initial load
duke
parents:
diff changeset
297 adjust_for_minor_pause_time(is_full_gc, &desired_promo_size, &desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 } else if(adjusted_mutator_cost() < _throughput_goal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // This branch used to require that (mutator_cost() > 0.0 in 1.4.2.
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // This sometimes resulted in skipping to the minimize footprint
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // code. Change this to try and reduce GC time if mutator time is
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // negative for whatever reason. Or for future consideration,
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // bail out of the code if mutator time is negative.
a61af66fc99e Initial load
duke
parents:
diff changeset
305 //
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // Throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
307 //
a61af66fc99e Initial load
duke
parents:
diff changeset
308 assert(major_cost >= 0.0, "major cost is < 0.0");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 assert(minor_cost >= 0.0, "minor cost is < 0.0");
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // Try to reduce the GC times.
a61af66fc99e Initial load
duke
parents:
diff changeset
311 adjust_for_throughput(is_full_gc, &desired_promo_size, &desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Be conservative about reducing the footprint.
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // Do a minimum number of major collections first.
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Have reasonable averages for major and minor collections costs.
a61af66fc99e Initial load
duke
parents:
diff changeset
318 if (UseAdaptiveSizePolicyFootprintGoal &&
a61af66fc99e Initial load
duke
parents:
diff changeset
319 young_gen_policy_is_ready() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
320 avg_major_gc_cost()->average() >= 0.0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
321 avg_minor_gc_cost()->average() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 size_t desired_sum = desired_eden_size + desired_promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 desired_eden_size = adjust_eden_for_footprint(desired_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
324 desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 set_decide_at_full_gc(decide_at_full_gc_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 desired_promo_size = adjust_promo_for_footprint(desired_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
328 desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // Note we make the same tests as in the code block below; the code
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // seems a little easier to read with the printing in another block.
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 if (desired_promo_size > promo_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // "free_in_old_gen" was the original value for used for promo_limit
a61af66fc99e Initial load
duke
parents:
diff changeset
338 size_t free_in_old_gen = (size_t)(max_old_gen_size - avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
339 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
340 "PSAdaptiveSizePolicy::compute_generation_free_space limits:"
a61af66fc99e Initial load
duke
parents:
diff changeset
341 " desired_promo_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
342 " promo_limit: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
343 " free_in_old_gen: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
344 " max_old_gen_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
345 " avg_old_live: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
346 desired_promo_size, promo_limit, free_in_old_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
347 max_old_gen_size, (size_t) avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349 if (desired_eden_size > eden_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
351 "AdaptiveSizePolicy::compute_generation_free_space limits:"
a61af66fc99e Initial load
duke
parents:
diff changeset
352 " desired_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
353 " old_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
354 " eden_limit: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
355 " cur_eden: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
356 " max_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
357 " avg_young_live: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
358 desired_eden_size, _eden_size, eden_limit, cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
359 max_eden_size, (size_t)avg_young_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (gc_cost() > gc_cost_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
363 "AdaptiveSizePolicy::compute_generation_free_space: gc time limit"
a61af66fc99e Initial load
duke
parents:
diff changeset
364 " gc_cost: %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
365 " GCTimeLimit: %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
366 gc_cost(), GCTimeLimit);
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // Align everything and make a final limit check
a61af66fc99e Initial load
duke
parents:
diff changeset
371 const size_t alignment = _intra_generation_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 desired_eden_size = align_size_up(desired_eden_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
373 desired_eden_size = MAX2(desired_eden_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 desired_promo_size = align_size_up(desired_promo_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 desired_promo_size = MAX2(desired_promo_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 eden_limit = align_size_down(eden_limit, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 promo_limit = align_size_down(promo_limit, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // Is too much time being spent in GC?
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // Is the heap trying to grow beyond it's limits?
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 const size_t free_in_old_gen = (size_t)(max_old_gen_size - avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
384 if (desired_promo_size > free_in_old_gen && desired_eden_size > eden_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // eden_limit is the upper limit on the size of eden based on
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // the maximum size of the young generation and the sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // of the survivor space.
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // The question being asked is whether the gc costs are high
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // and the space being recovered by a collection is low.
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // free_in_young_gen is the free space in the young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // after a collection and promo_live is the free space in the old
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // generation after a collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
394 //
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // Use the minimum of the current value of the live in the
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // young gen or the average of the live in the young gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // If the current value drops quickly, that should be taken
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // into account (i.e., don't trigger if the amount of free
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // space has suddenly jumped up). If the current is much
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // higher than the average, use the average since it represents
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // the longer term behavor.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 const size_t live_in_eden = MIN2(eden_live, (size_t) avg_eden_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
403 const size_t free_in_eden = eden_limit > live_in_eden ?
a61af66fc99e Initial load
duke
parents:
diff changeset
404 eden_limit - live_in_eden : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 const size_t total_free_limit = free_in_old_gen + free_in_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 const size_t total_mem = max_old_gen_size + max_eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
407 const double mem_free_limit = total_mem * (GCHeapFreeLimit/100.0);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 if (PrintAdaptiveSizePolicy && (Verbose ||
a61af66fc99e Initial load
duke
parents:
diff changeset
409 (total_free_limit < (size_t) mem_free_limit))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
411 "PSAdaptiveSizePolicy::compute_generation_free_space limits:"
a61af66fc99e Initial load
duke
parents:
diff changeset
412 " promo_limit: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
413 " eden_limit: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
414 " total_free_limit: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
415 " max_old_gen_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
416 " max_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
417 " mem_free_limit: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
418 promo_limit, eden_limit, total_free_limit,
a61af66fc99e Initial load
duke
parents:
diff changeset
419 max_old_gen_size, max_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
420 (size_t) mem_free_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 if (gc_cost() > gc_cost_limit &&
a61af66fc99e Initial load
duke
parents:
diff changeset
425 total_free_limit < (size_t) mem_free_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // Collections, on average, are taking too much time, and
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // gc_cost() > gc_cost_limit
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // we have too little space available after a full gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // total_free_limit < mem_free_limit
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // where
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // total_free_limit is the free space available in
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // both generations
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // total_mem is the total space available for allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // in both generations (survivor spaces are not included
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // just as they are not included in eden_limit).
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // mem_free_limit is a fraction of total_mem judged to be an
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // acceptable amount that is still unused.
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // The heap can ask for the value of this variable when deciding
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // whether to thrown an OutOfMemory error.
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // Note that the gc time limit test only works for the collections
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // of the young gen + tenured gen and not for collections of the
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // permanent gen. That is because the calculation of the space
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // freed by the collection is the free space in the young gen +
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // tenured gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Ignore explicit GC's. Ignoring explicit GC's at this level
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // is the equivalent of the GC did not happen as far as the
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // overhead calculation is concerted (i.e., the flag is not set
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // and the count is not affected). Also the average will not
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // have been updated unless UseAdaptiveSizePolicyWithSystemGC is on.
a61af66fc99e Initial load
duke
parents:
diff changeset
450 if (!GCCause::is_user_requested_gc(gc_cause) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
451 !GCCause::is_serviceability_requested_gc(gc_cause)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 inc_gc_time_limit_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
453 if (UseGCOverheadLimit &&
a61af66fc99e Initial load
duke
parents:
diff changeset
454 (gc_time_limit_count() > AdaptiveSizePolicyGCTimeLimitThreshold)){
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // All conditions have been met for throwing an out-of-memory
a61af66fc99e Initial load
duke
parents:
diff changeset
456 _gc_time_limit_exceeded = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Avoid consecutive OOM due to the gc time limit by resetting
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // the counter.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 reset_gc_time_limit_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 _print_gc_time_limit_would_be_exceeded = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Did not exceed overhead limits
a61af66fc99e Initial load
duke
parents:
diff changeset
465 reset_gc_time_limit_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // And one last limit check, now that we've aligned things.
a61af66fc99e Initial load
duke
parents:
diff changeset
472 if (desired_eden_size > eden_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // If the policy says to get a larger eden but
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // is hitting the limit, don't decrease eden.
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // This can lead to a general drifting down of the
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // eden size. Let the tenuring calculation push more
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // into the old gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
478 desired_eden_size = MAX2(eden_limit, cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480 desired_promo_size = MIN2(desired_promo_size, promo_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Timing stats
a61af66fc99e Initial load
duke
parents:
diff changeset
485 gclog_or_tty->print(
a61af66fc99e Initial load
duke
parents:
diff changeset
486 "PSAdaptiveSizePolicy::compute_generation_free_space: costs"
a61af66fc99e Initial load
duke
parents:
diff changeset
487 " minor_time: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
488 " major_cost: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
489 " mutator_cost: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
490 " throughput_goal: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
491 minor_gc_cost(), major_gc_cost(), mutator_cost(),
a61af66fc99e Initial load
duke
parents:
diff changeset
492 _throughput_goal);
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // We give more details if Verbose is set
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 gclog_or_tty->print( " minor_pause: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
497 " major_pause: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
498 " minor_interval: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
499 " major_interval: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
500 " pause_goal: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
501 _avg_minor_pause->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
502 _avg_major_pause->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
503 _avg_minor_interval->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
504 _avg_major_interval->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
505 gc_pause_goal_sec());
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // Footprint stats
a61af66fc99e Initial load
duke
parents:
diff changeset
509 gclog_or_tty->print( " live_space: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
510 " free_space: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
511 live_space(), free_space());
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // More detail
a61af66fc99e Initial load
duke
parents:
diff changeset
513 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 gclog_or_tty->print( " base_footprint: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
515 " avg_young_live: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
516 " avg_old_live: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
517 (size_t)_avg_base_footprint->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
518 (size_t)avg_young_live()->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
519 (size_t)avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // And finally, our old and new sizes.
a61af66fc99e Initial load
duke
parents:
diff changeset
523 gclog_or_tty->print(" old_promo_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
524 " old_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
525 " desired_promo_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
526 " desired_eden_size: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
527 _promo_size, _eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
528 desired_promo_size, desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
529 gclog_or_tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 decay_supplemental_growth(is_full_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 set_promo_size(desired_promo_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 set_eden_size(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
536 };
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 void PSAdaptiveSizePolicy::decay_supplemental_growth(bool is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // Decay the supplemental increment? Decay the supplement growth
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // factor even if it is not used. It is only meant to give a boost
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // to the initial growth and if it is not used, then it was not
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
543 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // Don't wait for the threshold value for the major collections. If
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // here, the supplemental growth term was used and should decay.
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if ((_avg_major_pause->count() % TenuredGenerationSizeSupplementDecay)
a61af66fc99e Initial load
duke
parents:
diff changeset
547 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 _old_gen_size_increment_supplement =
a61af66fc99e Initial load
duke
parents:
diff changeset
549 _old_gen_size_increment_supplement >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
551 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
552 if ((_avg_minor_pause->count() >= AdaptiveSizePolicyReadyThreshold) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
553 (_avg_minor_pause->count() % YoungGenerationSizeSupplementDecay) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 _young_gen_size_increment_supplement =
a61af66fc99e Initial load
duke
parents:
diff changeset
555 _young_gen_size_increment_supplement >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 }
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 void PSAdaptiveSizePolicy::adjust_for_minor_pause_time(bool is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
561 size_t* desired_promo_size_ptr, size_t* desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Adjust the young generation size to reduce pause time of
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // of collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 //
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // The AdaptiveSizePolicyInitializingSteps test is not used
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // here. It has not seemed to be needed but perhaps should
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // be added for consistency.
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (minor_pause_young_estimator()->decrement_will_decrease()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // reduce eden size
a61af66fc99e Initial load
duke
parents:
diff changeset
571 set_change_young_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
572 decrease_young_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 *desired_eden_size_ptr = *desired_eden_size_ptr -
a61af66fc99e Initial load
duke
parents:
diff changeset
574 eden_decrement_aligned_down(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // Only record that the estimator indicated such an action.
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // *desired_eden_size_ptr = *desired_eden_size_ptr + eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
579 set_change_young_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
580 increase_young_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582 if (PSAdjustTenuredGenForMinorPause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // If the desired eden size is as small as it will get,
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // try to adjust the old gen size.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 if (*desired_eden_size_ptr <= _intra_generation_alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // Vary the old gen size to reduce the young gen pause. This
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // may not be a good idea. This is just a test.
a61af66fc99e Initial load
duke
parents:
diff changeset
588 if (minor_pause_old_estimator()->decrement_will_decrease()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 set_change_old_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
590 decrease_old_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
591 *desired_promo_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
592 _promo_size - promo_decrement_aligned_down(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
594 set_change_old_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
595 increase_old_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
596 size_t promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
597 promo_increment_with_supplement_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 if ((*desired_promo_size_ptr + promo_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
599 *desired_promo_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 *desired_promo_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
601 _promo_size + promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 void PSAdaptiveSizePolicy::adjust_for_pause_time(bool is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
609 size_t* desired_promo_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
610 size_t* desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 size_t promo_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
613 size_t eden_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // Add some checks for a threshhold for a change. For example,
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // a change less than the required alignment is probably not worth
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // attempting.
a61af66fc99e Initial load
duke
parents:
diff changeset
617 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
618 set_decide_at_full_gc(decide_at_full_gc_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 if (_avg_minor_pause->padded_average() > _avg_major_pause->padded_average()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
622 adjust_for_minor_pause_time(is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
623 desired_promo_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
624 desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // major pause adjustments
a61af66fc99e Initial load
duke
parents:
diff changeset
626 } else if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // Adjust for the major pause time only at full gc's because the
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // affects of a change can only be seen at full gc's.
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // Reduce old generation size to reduce pause?
a61af66fc99e Initial load
duke
parents:
diff changeset
631 if (major_pause_old_estimator()->decrement_will_decrease()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // reduce old generation size
a61af66fc99e Initial load
duke
parents:
diff changeset
633 set_change_old_gen_for_maj_pauses(decrease_old_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 promo_heap_delta = promo_decrement_aligned_down(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
635 *desired_promo_size_ptr = _promo_size - promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
636 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // Only record that the estimator indicated such an action.
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // *desired_promo_size_ptr = _promo_size +
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // promo_increment_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
641 set_change_old_gen_for_maj_pauses(increase_old_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
643 if (PSAdjustYoungGenForMajorPause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 // If the promo size is at the minimum (i.e., the old gen
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // size will not actually decrease), consider changing the
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // young gen size.
a61af66fc99e Initial load
duke
parents:
diff changeset
647 if (*desired_promo_size_ptr < _intra_generation_alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // If increasing the young generation will decrease the old gen
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // pause, do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // During startup there is noise in the statistics for deciding
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // on whether to increase or decrease the young gen size. For
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // some number of iterations, just try to increase the young
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // gen size if the major pause is too long to try and establish
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // good statistics for later decisions.
a61af66fc99e Initial load
duke
parents:
diff changeset
655 if (major_pause_young_estimator()->increment_will_decrease() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
656 (_young_gen_change_for_major_pause_count
a61af66fc99e Initial load
duke
parents:
diff changeset
657 <= AdaptiveSizePolicyInitializingSteps)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 set_change_young_gen_for_maj_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
659 increase_young_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 eden_heap_delta = eden_increment_aligned_up(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 *desired_eden_size_ptr = _eden_size + eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
662 _young_gen_change_for_major_pause_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
663 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // Record that decreasing the young gen size would decrease
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // the major pause
a61af66fc99e Initial load
duke
parents:
diff changeset
666 set_change_young_gen_for_maj_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
667 decrease_young_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
668 eden_heap_delta = eden_decrement_aligned_down(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
669 *desired_eden_size_ptr = _eden_size - eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
677 "AdaptiveSizePolicy::compute_generation_free_space "
a61af66fc99e Initial load
duke
parents:
diff changeset
678 "adjusting gen sizes for major pause (avg %f goal %f). "
a61af66fc99e Initial load
duke
parents:
diff changeset
679 "desired_promo_size " SIZE_FORMAT "desired_eden_size "
a61af66fc99e Initial load
duke
parents:
diff changeset
680 SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
681 " promo delta " SIZE_FORMAT " eden delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
682 _avg_major_pause->average(), gc_pause_goal_sec(),
a61af66fc99e Initial load
duke
parents:
diff changeset
683 *desired_promo_size_ptr, *desired_eden_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
684 promo_heap_delta, eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 void PSAdaptiveSizePolicy::adjust_for_throughput(bool is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
689 size_t* desired_promo_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
690 size_t* desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // Add some checks for a threshhold for a change. For example,
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // a change less than the required alignment is probably not worth
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // attempting.
a61af66fc99e Initial load
duke
parents:
diff changeset
695 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 set_decide_at_full_gc(decide_at_full_gc_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if ((gc_cost() + mutator_cost()) == 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
704 gclog_or_tty->print("\nPSAdaptiveSizePolicy::adjust_for_throughput("
a61af66fc99e Initial load
duke
parents:
diff changeset
705 "is_full: %d, promo: " SIZE_FORMAT ", cur_eden: " SIZE_FORMAT "): ",
a61af66fc99e Initial load
duke
parents:
diff changeset
706 is_full_gc, *desired_promo_size_ptr, *desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 gclog_or_tty->print_cr("mutator_cost %f major_gc_cost %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
708 "minor_gc_cost %f", mutator_cost(), major_gc_cost(), minor_gc_cost());
a61af66fc99e Initial load
duke
parents:
diff changeset
709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // Tenured generation
a61af66fc99e Initial load
duke
parents:
diff changeset
712 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // Calculate the change to use for the tenured gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
715 size_t scaled_promo_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // Can the increment to the generation be scaled?
a61af66fc99e Initial load
duke
parents:
diff changeset
717 if (gc_cost() >= 0.0 && major_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 size_t promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
719 promo_increment_with_supplement_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
720 double scale_by_ratio = major_gc_cost() / gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
721 scaled_promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
722 (size_t) (scale_by_ratio * (double) promo_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
724 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
725 "Scaled tenured increment: " SIZE_FORMAT " by %f down to "
a61af66fc99e Initial load
duke
parents:
diff changeset
726 SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
727 promo_heap_delta, scale_by_ratio, scaled_promo_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729 } else if (major_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // Scaling is not going to work. If the major gc time is the
a61af66fc99e Initial load
duke
parents:
diff changeset
731 // larger, give it a full increment.
a61af66fc99e Initial load
duke
parents:
diff changeset
732 if (major_gc_cost() >= minor_gc_cost()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 scaled_promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
734 promo_increment_with_supplement_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // Don't expect to get here but it's ok if it does
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // in the product build since the delta will be 0
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // and nothing will change.
a61af66fc99e Initial load
duke
parents:
diff changeset
740 assert(false, "Unexpected value for gc costs");
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 switch (AdaptiveSizeThroughPutPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // Early in the run the statistics might not be good. Until
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // a specific number of collections have been, use the heuristic
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // that a larger generation size means lower collection costs.
a61af66fc99e Initial load
duke
parents:
diff changeset
748 if (major_collection_estimator()->increment_will_decrease() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
749 (_old_gen_change_for_major_throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
750 <= AdaptiveSizePolicyInitializingSteps)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // Increase tenured generation size to reduce major collection cost
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if ((*desired_promo_size_ptr + scaled_promo_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
753 *desired_promo_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 *desired_promo_size_ptr = _promo_size + scaled_promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756 set_change_old_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
757 increase_old_gen_for_throughput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 _old_gen_change_for_major_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
759 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Record that decreasing the old gen size would decrease
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // the major collection cost but don't do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // *desired_promo_size_ptr = _promo_size -
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // promo_decrement_aligned_down(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 set_change_old_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
766 decrease_old_gen_for_throughput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
768
a61af66fc99e Initial load
duke
parents:
diff changeset
769 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // Simplest strategy
a61af66fc99e Initial load
duke
parents:
diff changeset
772 if ((*desired_promo_size_ptr + scaled_promo_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
773 *desired_promo_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 *desired_promo_size_ptr = *desired_promo_size_ptr +
a61af66fc99e Initial load
duke
parents:
diff changeset
775 scaled_promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777 set_change_old_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
778 increase_old_gen_for_throughput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 _old_gen_change_for_major_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
784 "adjusting tenured gen for throughput (avg %f goal %f). "
a61af66fc99e Initial load
duke
parents:
diff changeset
785 "desired_promo_size " SIZE_FORMAT " promo_delta " SIZE_FORMAT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
786 mutator_cost(), _throughput_goal,
a61af66fc99e Initial load
duke
parents:
diff changeset
787 *desired_promo_size_ptr, scaled_promo_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
790
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // Young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
792 size_t scaled_eden_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
793 // Can the increment to the generation be scaled?
a61af66fc99e Initial load
duke
parents:
diff changeset
794 if (gc_cost() >= 0.0 && minor_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
795 size_t eden_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
796 eden_increment_with_supplement_aligned_up(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
797 double scale_by_ratio = minor_gc_cost() / gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
798 assert(scale_by_ratio <= 1.0 && scale_by_ratio >= 0.0, "Scaling is wrong");
a61af66fc99e Initial load
duke
parents:
diff changeset
799 scaled_eden_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
800 (size_t) (scale_by_ratio * (double) eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
801 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
802 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
803 "Scaled eden increment: " SIZE_FORMAT " by %f down to "
a61af66fc99e Initial load
duke
parents:
diff changeset
804 SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
805 eden_heap_delta, scale_by_ratio, scaled_eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
807 } else if (minor_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // Scaling is not going to work. If the minor gc time is the
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // larger, give it a full increment.
a61af66fc99e Initial load
duke
parents:
diff changeset
810 if (minor_gc_cost() > major_gc_cost()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 scaled_eden_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
812 eden_increment_with_supplement_aligned_up(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
814 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // Don't expect to get here but it's ok if it does
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // in the product build since the delta will be 0
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // and nothing will change.
a61af66fc99e Initial load
duke
parents:
diff changeset
818 assert(false, "Unexpected value for gc costs");
a61af66fc99e Initial load
duke
parents:
diff changeset
819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 // Use a heuristic for some number of collections to give
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // the averages time to settle down.
a61af66fc99e Initial load
duke
parents:
diff changeset
823 switch (AdaptiveSizeThroughPutPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
825 if (minor_collection_estimator()->increment_will_decrease() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
826 (_young_gen_change_for_minor_throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
827 <= AdaptiveSizePolicyInitializingSteps)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // Expand young generation size to reduce frequency of
a61af66fc99e Initial load
duke
parents:
diff changeset
829 // of collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
830 if ((*desired_eden_size_ptr + scaled_eden_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
831 *desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
832 *desired_eden_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
833 *desired_eden_size_ptr + scaled_eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835 set_change_young_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
836 increase_young_gen_for_througput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 _young_gen_change_for_minor_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
838 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
839 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // Record that decreasing the young gen size would decrease
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // the minor collection cost but don't do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // *desired_eden_size_ptr = _eden_size -
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // eden_decrement_aligned_down(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
844 set_change_young_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
845 decrease_young_gen_for_througput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
847 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
848 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
849 if ((*desired_eden_size_ptr + scaled_eden_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
850 *desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 *desired_eden_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
852 *desired_eden_size_ptr + scaled_eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854 set_change_young_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
855 increase_young_gen_for_througput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
856 _young_gen_change_for_minor_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
860 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
861 "adjusting eden for throughput (avg %f goal %f). desired_eden_size "
a61af66fc99e Initial load
duke
parents:
diff changeset
862 SIZE_FORMAT " eden delta " SIZE_FORMAT "\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
863 mutator_cost(), _throughput_goal,
a61af66fc99e Initial load
duke
parents:
diff changeset
864 *desired_eden_size_ptr, scaled_eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 size_t PSAdaptiveSizePolicy::adjust_promo_for_footprint(
a61af66fc99e Initial load
duke
parents:
diff changeset
869 size_t desired_promo_size, size_t desired_sum) {
a61af66fc99e Initial load
duke
parents:
diff changeset
870 assert(desired_promo_size <= desired_sum, "Inconsistent parameters");
a61af66fc99e Initial load
duke
parents:
diff changeset
871 set_decrease_for_footprint(decrease_old_gen_for_footprint_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 size_t change = promo_decrement(desired_promo_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
874 change = scale_down(change, desired_promo_size, desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876 size_t reduced_size = desired_promo_size - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
880 "AdaptiveSizePolicy::compute_generation_free_space "
a61af66fc99e Initial load
duke
parents:
diff changeset
881 "adjusting tenured gen for footprint. "
a61af66fc99e Initial load
duke
parents:
diff changeset
882 "starting promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
883 " reduced promo size " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
884 " promo delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
885 desired_promo_size, reduced_size, change );
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 assert(reduced_size <= desired_promo_size, "Inconsistent result");
a61af66fc99e Initial load
duke
parents:
diff changeset
889 return reduced_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 size_t PSAdaptiveSizePolicy::adjust_eden_for_footprint(
a61af66fc99e Initial load
duke
parents:
diff changeset
893 size_t desired_eden_size, size_t desired_sum) {
a61af66fc99e Initial load
duke
parents:
diff changeset
894 assert(desired_eden_size <= desired_sum, "Inconsistent parameters");
a61af66fc99e Initial load
duke
parents:
diff changeset
895 set_decrease_for_footprint(decrease_young_gen_for_footprint_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 size_t change = eden_decrement(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
898 change = scale_down(change, desired_eden_size, desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 size_t reduced_size = desired_eden_size - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
904 "AdaptiveSizePolicy::compute_generation_free_space "
a61af66fc99e Initial load
duke
parents:
diff changeset
905 "adjusting eden for footprint. "
a61af66fc99e Initial load
duke
parents:
diff changeset
906 " starting eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
907 " reduced eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
908 " eden delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
909 desired_eden_size, reduced_size, change);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 assert(reduced_size <= desired_eden_size, "Inconsistent result");
a61af66fc99e Initial load
duke
parents:
diff changeset
913 return reduced_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // Scale down "change" by the factor
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // part / total
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // Don't align the results.
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 size_t PSAdaptiveSizePolicy::scale_down(size_t change,
a61af66fc99e Initial load
duke
parents:
diff changeset
921 double part,
a61af66fc99e Initial load
duke
parents:
diff changeset
922 double total) {
a61af66fc99e Initial load
duke
parents:
diff changeset
923 assert(part <= total, "Inconsistent input");
a61af66fc99e Initial load
duke
parents:
diff changeset
924 size_t reduced_change = change;
a61af66fc99e Initial load
duke
parents:
diff changeset
925 if (total > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
926 double fraction = part / total;
a61af66fc99e Initial load
duke
parents:
diff changeset
927 reduced_change = (size_t) (fraction * (double) change);
a61af66fc99e Initial load
duke
parents:
diff changeset
928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
929 assert(reduced_change <= change, "Inconsistent result");
a61af66fc99e Initial load
duke
parents:
diff changeset
930 return reduced_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 size_t PSAdaptiveSizePolicy::eden_increment(size_t cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
934 uint percent_change) {
a61af66fc99e Initial load
duke
parents:
diff changeset
935 size_t eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
936 eden_heap_delta = cur_eden / 100 * percent_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
937 return eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940 size_t PSAdaptiveSizePolicy::eden_increment(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
941 return eden_increment(cur_eden, YoungGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 size_t PSAdaptiveSizePolicy::eden_increment_aligned_up(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 size_t result = eden_increment(cur_eden, YoungGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
946 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 size_t PSAdaptiveSizePolicy::eden_increment_aligned_down(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
950 size_t result = eden_increment(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
951 return align_size_down(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954 size_t PSAdaptiveSizePolicy::eden_increment_with_supplement_aligned_up(
a61af66fc99e Initial load
duke
parents:
diff changeset
955 size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
956 size_t result = eden_increment(cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
957 YoungGenerationSizeIncrement + _young_gen_size_increment_supplement);
a61af66fc99e Initial load
duke
parents:
diff changeset
958 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
959 }
a61af66fc99e Initial load
duke
parents:
diff changeset
960
a61af66fc99e Initial load
duke
parents:
diff changeset
961 size_t PSAdaptiveSizePolicy::eden_decrement_aligned_down(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 size_t eden_heap_delta = eden_decrement(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
963 return align_size_down(eden_heap_delta, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
965
a61af66fc99e Initial load
duke
parents:
diff changeset
966 size_t PSAdaptiveSizePolicy::eden_decrement(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
967 size_t eden_heap_delta = eden_increment(cur_eden) /
a61af66fc99e Initial load
duke
parents:
diff changeset
968 AdaptiveSizeDecrementScaleFactor;
a61af66fc99e Initial load
duke
parents:
diff changeset
969 return eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
970 }
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 size_t PSAdaptiveSizePolicy::promo_increment(size_t cur_promo,
a61af66fc99e Initial load
duke
parents:
diff changeset
973 uint percent_change) {
a61af66fc99e Initial load
duke
parents:
diff changeset
974 size_t promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
975 promo_heap_delta = cur_promo / 100 * percent_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
976 return promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
978
a61af66fc99e Initial load
duke
parents:
diff changeset
979 size_t PSAdaptiveSizePolicy::promo_increment(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
980 return promo_increment(cur_promo, TenuredGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
981 }
a61af66fc99e Initial load
duke
parents:
diff changeset
982
a61af66fc99e Initial load
duke
parents:
diff changeset
983 size_t PSAdaptiveSizePolicy::promo_increment_aligned_up(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
984 size_t result = promo_increment(cur_promo, TenuredGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
985 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
986 }
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 size_t PSAdaptiveSizePolicy::promo_increment_aligned_down(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
989 size_t result = promo_increment(cur_promo, TenuredGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
990 return align_size_down(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 size_t PSAdaptiveSizePolicy::promo_increment_with_supplement_aligned_up(
a61af66fc99e Initial load
duke
parents:
diff changeset
994 size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
995 size_t result = promo_increment(cur_promo,
a61af66fc99e Initial load
duke
parents:
diff changeset
996 TenuredGenerationSizeIncrement + _old_gen_size_increment_supplement);
a61af66fc99e Initial load
duke
parents:
diff changeset
997 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
999
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 size_t PSAdaptiveSizePolicy::promo_decrement_aligned_down(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 size_t promo_heap_delta = promo_decrement(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 return align_size_down(promo_heap_delta, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1004
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 size_t PSAdaptiveSizePolicy::promo_decrement(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 size_t promo_heap_delta = promo_increment(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 promo_heap_delta = promo_heap_delta / AdaptiveSizeDecrementScaleFactor;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 return promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1010
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 int PSAdaptiveSizePolicy::compute_survivor_space_size_and_threshold(
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 bool is_survivor_overflow,
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 int tenuring_threshold,
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 size_t survivor_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 assert(survivor_limit >= _intra_generation_alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 "survivor_limit too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 assert((size_t)align_size_down(survivor_limit, _intra_generation_alignment)
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 == survivor_limit, "survivor_limit not aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 // This method is called even if the tenuring threshold and survivor
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 // spaces are not adjusted so that the averages are sampled above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 if (!UsePSAdaptiveSurvivorSizePolicy ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 !young_gen_policy_is_ready()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 return tenuring_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1026
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 // We'll decide whether to increase or decrease the tenuring
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // threshold based partly on the newly computed survivor size
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 // (if we hit the maximum limit allowed, we'll always choose to
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // decrement the threshold).
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 bool incr_tenuring_threshold = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 bool decr_tenuring_threshold = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 set_decrement_tenuring_threshold_for_gc_cost(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 set_increment_tenuring_threshold_for_gc_cost(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 set_decrement_tenuring_threshold_for_survivor_limit(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 if (!is_survivor_overflow) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // Keep running averages on how much survived
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 // We use the tenuring threshold to equalize the cost of major
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // and minor collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 // ThresholdTolerance is used to indicate how sensitive the
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 // tenuring threshold is to differences in cost betweent the
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 // collection types.
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // Get the times of interest. This involves a little work, so
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 // we cache the values here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 const double major_cost = major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 const double minor_cost = minor_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 if (minor_cost > major_cost * _threshold_tolerance_percent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 // Minor times are getting too long; lower the threshold so
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // less survives and more is promoted.
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 set_decrement_tenuring_threshold_for_gc_cost(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 } else if (major_cost > minor_cost * _threshold_tolerance_percent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // Major times are too long, so we want less promotion.
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 incr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 set_increment_tenuring_threshold_for_gc_cost(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // Survivor space overflow occurred, so promoted and survived are
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // not accurate. We'll make our best guess by combining survived
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 // and promoted and count them as survivors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // We'll lower the tenuring threshold to see if we can correct
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // things. Also, set the survivor size conservatively. We're
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 // trying to avoid many overflows from occurring if defnew size
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 // is just too small.
a61af66fc99e Initial load
duke
parents:
diff changeset
1072
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1075
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // The padded average also maintains a deviation from the average;
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 // we use this to see how good of an estimate we have of what survived.
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // We're trying to pad the survivor size as little as possible without
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // overflowing the survivor spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 size_t target_size = align_size_up((size_t)_avg_survived->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 target_size = MAX2(target_size, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 if (target_size > survivor_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 // Target size is bigger than we can handle. Let's also reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // the tenuring threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 target_size = survivor_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 set_decrement_tenuring_threshold_for_survivor_limit(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1091
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // Finally, increment or decrement the tenuring threshold, as decided above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // We test for decrementing first, as we might have hit the target size
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // limit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 if (decr_tenuring_threshold && !(AlwaysTenure || NeverTenure)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 if (tenuring_threshold > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 tenuring_threshold--;
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 } else if (incr_tenuring_threshold && !(AlwaysTenure || NeverTenure)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 if (tenuring_threshold < MaxTenuringThreshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 tenuring_threshold++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // We keep a running average of the amount promoted which is used
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // to decide when we should collect the old generation (when
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // the amount of old gen free space is less than what we expect to
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // promote).
a61af66fc99e Initial load
duke
parents:
diff changeset
1109
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // A little more detail if Verbose is on
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 gclog_or_tty->print( " avg_survived: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 " avg_deviation: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 _avg_survived->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 _avg_survived->deviation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 gclog_or_tty->print( " avg_survived_padded_avg: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 _avg_survived->padded_average());
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 gclog_or_tty->print( " avg_promoted_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 " avg_promoted_dev: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 avg_promoted()->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 avg_promoted()->deviation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 gclog_or_tty->print( " avg_promoted_padded_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 " avg_pretenured_padded_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 " tenuring_thresh: %d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 " target_size: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 avg_promoted()->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 _avg_pretenured->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 tenuring_threshold, target_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 set_survivor_size(target_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 return tenuring_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 void PSAdaptiveSizePolicy::update_averages(bool is_survivor_overflow,
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 size_t survived,
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 size_t promoted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 // Update averages
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 if (!is_survivor_overflow) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // Keep running averages on how much survived
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 _avg_survived->sample(survived);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 size_t survived_guess = survived + promoted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 _avg_survived->sample(survived_guess);
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 avg_promoted()->sample(promoted + _avg_pretenured->padded_average());
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 gclog_or_tty->print(
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 "AdaptiveSizePolicy::compute_survivor_space_size_and_thresh:"
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 " survived: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 " promoted: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 " overflow: %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 survived, promoted, is_survivor_overflow ? "true" : "false");
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 bool PSAdaptiveSizePolicy::print_adaptive_size_policy_on(outputStream* st)
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 if (!UseAdaptiveSizePolicy) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1171
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 return AdaptiveSizePolicy::print_adaptive_size_policy_on(
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 st,
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 PSScavenge::tenuring_threshold());
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 }