annotate src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp @ 3772:6747fd0512e0

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