annotate src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp @ 10185:d50cc62e94ff

8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime. Reviewed-by: twisti, johnc Contributed-by: Martin Doerr <martin.doerr@sap.com>
author johnc
date Wed, 24 Apr 2013 14:48:43 -0700
parents 22b8d3d181d9
children eba99d16dc6f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
2 * Copyright (c) 2002, 2012, 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 cur_eden,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
202 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
203 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
204 bool is_full_gc,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
205 GCCause::Cause gc_cause,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
206 CollectorPolicy* collector_policy) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Update statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Time statistics are updated as we go, update footprint stats here
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
210 _avg_base_footprint->sample(BaseFootPrintEstimate);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 avg_young_live()->sample(young_live);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 avg_eden_live()->sample(eden_live);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // old_live is only accurate after a full gc
a61af66fc99e Initial load
duke
parents:
diff changeset
215 avg_old_live()->sample(old_live);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // This code used to return if the policy was not ready , i.e.,
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // policy_is_ready() returning false. The intent was that
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // decisions below needed major collection times and so could
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // not be made before two major collections. A consequence was
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // adjustments to the young generation were not done until after
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // two major collections even if the minor collections times
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // exceeded the requested goals. Now let the young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // adjust for the minor collection times. Major collection times
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // will be zero for the first collection and will naturally be
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // ignored. Tenured generation adjustments are only made at the
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // full collections so until the second major collection has
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // been reached, no tenured generation adjustments will be made.
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Until we know better, desired promotion size uses the last calculation
a61af66fc99e Initial load
duke
parents:
diff changeset
232 size_t desired_promo_size = _promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // Start eden at the current value. The desired value that is stored
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // in _eden_size is not bounded by constraints of the heap and can
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // run away.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 //
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // As expected setting desired_eden_size to the current
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // value of desired_eden_size as a starting point
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // caused desired_eden_size to grow way too large and caused
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // an overflow down stream. It may have improved performance in
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // some case but is dangerous.
a61af66fc99e Initial load
duke
parents:
diff changeset
243 size_t desired_eden_size = cur_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
246 size_t original_promo_size = desired_promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 size_t original_eden_size = desired_eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Cache some values. There's a bit of work getting these, so
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // we might save a little time.
a61af66fc99e Initial load
duke
parents:
diff changeset
252 const double major_cost = major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
253 const double minor_cost = minor_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Used for diagnostics
a61af66fc99e Initial load
duke
parents:
diff changeset
256 clear_generation_free_space_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Limits on our growth
a61af66fc99e Initial load
duke
parents:
diff changeset
259 size_t promo_limit = (size_t)(max_old_gen_size - avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // This method sets the desired eden size. That plus the
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // desired survivor space sizes sets the desired young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // size. This methods does not know what the desired survivor
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // size is but expects that other policy will attempt to make
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // the survivor sizes compatible with the live data in the
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // young generation. This limit is an estimate of the space left
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // in the young generation after the survivor spaces have been
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // subtracted out.
a61af66fc99e Initial load
duke
parents:
diff changeset
269 size_t eden_limit = max_eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // But don't force a promo size below the current promo size. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // the promo size will shrink for no good reason.
a61af66fc99e Initial load
duke
parents:
diff changeset
273 promo_limit = MAX2(promo_limit, _promo_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 const double gc_cost_limit = GCTimeLimit/100.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Which way should we go?
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // if pause requirement is not met
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // adjust size of any generation with average paus exceeding
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // the pause limit. Adjust one pause at a time (the larger)
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // and only make adjustments for the major pause at full collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // else if throughput requirement not met
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // adjust the size of the generation with larger gc time. Only
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // adjust one generation at a time.
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // else
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // adjust down the total heap size. Adjust down the larger of the
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // Add some checks for a threshhold for a change. For example,
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // a change less than the necessary alignment is probably not worth
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // attempting.
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if ((_avg_minor_pause->padded_average() > gc_pause_goal_sec()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
295 (_avg_major_pause->padded_average() > gc_pause_goal_sec())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 //
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Check pauses
a61af66fc99e Initial load
duke
parents:
diff changeset
298 //
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // Make changes only to affect one of the pauses (the larger)
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // at a time.
a61af66fc99e Initial load
duke
parents:
diff changeset
301 adjust_for_pause_time(is_full_gc, &desired_promo_size, &desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 } else if (_avg_minor_pause->padded_average() > gc_minor_pause_goal_sec()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Adjust only for the minor pause time goal
a61af66fc99e Initial load
duke
parents:
diff changeset
305 adjust_for_minor_pause_time(is_full_gc, &desired_promo_size, &desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 } else if(adjusted_mutator_cost() < _throughput_goal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // This branch used to require that (mutator_cost() > 0.0 in 1.4.2.
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // This sometimes resulted in skipping to the minimize footprint
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // code. Change this to try and reduce GC time if mutator time is
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // negative for whatever reason. Or for future consideration,
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // bail out of the code if mutator time is negative.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 //
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // Throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
315 //
a61af66fc99e Initial load
duke
parents:
diff changeset
316 assert(major_cost >= 0.0, "major cost is < 0.0");
a61af66fc99e Initial load
duke
parents:
diff changeset
317 assert(minor_cost >= 0.0, "minor cost is < 0.0");
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Try to reduce the GC times.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 adjust_for_throughput(is_full_gc, &desired_promo_size, &desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Be conservative about reducing the footprint.
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // Do a minimum number of major collections first.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Have reasonable averages for major and minor collections costs.
a61af66fc99e Initial load
duke
parents:
diff changeset
326 if (UseAdaptiveSizePolicyFootprintGoal &&
a61af66fc99e Initial load
duke
parents:
diff changeset
327 young_gen_policy_is_ready() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
328 avg_major_gc_cost()->average() >= 0.0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
329 avg_minor_gc_cost()->average() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 size_t desired_sum = desired_eden_size + desired_promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 desired_eden_size = adjust_eden_for_footprint(desired_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
332 desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 set_decide_at_full_gc(decide_at_full_gc_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
335 desired_promo_size = adjust_promo_for_footprint(desired_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
336 desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
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 // Note we make the same tests as in the code block below; the code
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // seems a little easier to read with the printing in another block.
a61af66fc99e Initial load
duke
parents:
diff changeset
343 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 if (desired_promo_size > promo_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // "free_in_old_gen" was the original value for used for promo_limit
a61af66fc99e Initial load
duke
parents:
diff changeset
346 size_t free_in_old_gen = (size_t)(max_old_gen_size - avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
347 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
348 "PSAdaptiveSizePolicy::compute_generation_free_space limits:"
a61af66fc99e Initial load
duke
parents:
diff changeset
349 " desired_promo_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
350 " promo_limit: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
351 " free_in_old_gen: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
352 " max_old_gen_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
353 " avg_old_live: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
354 desired_promo_size, promo_limit, free_in_old_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
355 max_old_gen_size, (size_t) avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357 if (desired_eden_size > eden_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
359 "AdaptiveSizePolicy::compute_generation_free_space limits:"
a61af66fc99e Initial load
duke
parents:
diff changeset
360 " desired_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
361 " old_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
362 " eden_limit: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
363 " cur_eden: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
364 " max_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
365 " avg_young_live: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
366 desired_eden_size, _eden_size, eden_limit, cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
367 max_eden_size, (size_t)avg_young_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 if (gc_cost() > gc_cost_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
371 "AdaptiveSizePolicy::compute_generation_free_space: gc time limit"
a61af66fc99e Initial load
duke
parents:
diff changeset
372 " gc_cost: %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
373 " GCTimeLimit: %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
374 gc_cost(), GCTimeLimit);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Align everything and make a final limit check
a61af66fc99e Initial load
duke
parents:
diff changeset
379 const size_t alignment = _intra_generation_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 desired_eden_size = align_size_up(desired_eden_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 desired_eden_size = MAX2(desired_eden_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 desired_promo_size = align_size_up(desired_promo_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
383 desired_promo_size = MAX2(desired_promo_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 eden_limit = align_size_down(eden_limit, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 promo_limit = align_size_down(promo_limit, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
387
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // Is too much time being spent in GC?
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // Is the heap trying to grow beyond it's limits?
a61af66fc99e Initial load
duke
parents:
diff changeset
390
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
391 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
392 (size_t)(max_old_gen_size - avg_old_live()->average());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
393 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
394 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
395 eden_live,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
396 max_old_gen_size,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
397 max_eden_size,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
398 is_full_gc,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
399 gc_cause,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 0
diff changeset
400 collector_policy);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // And one last limit check, now that we've aligned things.
a61af66fc99e Initial load
duke
parents:
diff changeset
405 if (desired_eden_size > eden_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // If the policy says to get a larger eden but
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // is hitting the limit, don't decrease eden.
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // This can lead to a general drifting down of the
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // eden size. Let the tenuring calculation push more
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // into the old gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
411 desired_eden_size = MAX2(eden_limit, cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413 desired_promo_size = MIN2(desired_promo_size, promo_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Timing stats
a61af66fc99e Initial load
duke
parents:
diff changeset
418 gclog_or_tty->print(
a61af66fc99e Initial load
duke
parents:
diff changeset
419 "PSAdaptiveSizePolicy::compute_generation_free_space: costs"
a61af66fc99e Initial load
duke
parents:
diff changeset
420 " minor_time: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
421 " major_cost: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
422 " mutator_cost: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
423 " throughput_goal: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
424 minor_gc_cost(), major_gc_cost(), mutator_cost(),
a61af66fc99e Initial load
duke
parents:
diff changeset
425 _throughput_goal);
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // We give more details if Verbose is set
a61af66fc99e Initial load
duke
parents:
diff changeset
428 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 gclog_or_tty->print( " minor_pause: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
430 " major_pause: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
431 " minor_interval: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
432 " major_interval: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
433 " pause_goal: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
434 _avg_minor_pause->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
435 _avg_major_pause->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
436 _avg_minor_interval->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
437 _avg_major_interval->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
438 gc_pause_goal_sec());
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // Footprint stats
a61af66fc99e Initial load
duke
parents:
diff changeset
442 gclog_or_tty->print( " live_space: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
443 " free_space: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
444 live_space(), free_space());
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // More detail
a61af66fc99e Initial load
duke
parents:
diff changeset
446 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 gclog_or_tty->print( " base_footprint: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
448 " avg_young_live: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
449 " avg_old_live: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
450 (size_t)_avg_base_footprint->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
451 (size_t)avg_young_live()->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
452 (size_t)avg_old_live()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // And finally, our old and new sizes.
a61af66fc99e Initial load
duke
parents:
diff changeset
456 gclog_or_tty->print(" old_promo_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
457 " old_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
458 " desired_promo_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
459 " desired_eden_size: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
460 _promo_size, _eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
461 desired_promo_size, desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 gclog_or_tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 decay_supplemental_growth(is_full_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 set_promo_size(desired_promo_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
468 set_eden_size(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 };
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 void PSAdaptiveSizePolicy::decay_supplemental_growth(bool is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // Decay the supplemental increment? Decay the supplement growth
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // factor even if it is not used. It is only meant to give a boost
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // to the initial growth and if it is not used, then it was not
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
476 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // Don't wait for the threshold value for the major collections. If
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // here, the supplemental growth term was used and should decay.
a61af66fc99e Initial load
duke
parents:
diff changeset
479 if ((_avg_major_pause->count() % TenuredGenerationSizeSupplementDecay)
a61af66fc99e Initial load
duke
parents:
diff changeset
480 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 _old_gen_size_increment_supplement =
a61af66fc99e Initial load
duke
parents:
diff changeset
482 _old_gen_size_increment_supplement >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 if ((_avg_minor_pause->count() >= AdaptiveSizePolicyReadyThreshold) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
486 (_avg_minor_pause->count() % YoungGenerationSizeSupplementDecay) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 _young_gen_size_increment_supplement =
a61af66fc99e Initial load
duke
parents:
diff changeset
488 _young_gen_size_increment_supplement >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
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 void PSAdaptiveSizePolicy::adjust_for_minor_pause_time(bool is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
494 size_t* desired_promo_size_ptr, size_t* desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // Adjust the young generation size to reduce pause time of
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // of collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
498 //
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // The AdaptiveSizePolicyInitializingSteps test is not used
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // here. It has not seemed to be needed but perhaps should
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // be added for consistency.
a61af66fc99e Initial load
duke
parents:
diff changeset
502 if (minor_pause_young_estimator()->decrement_will_decrease()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // reduce eden size
a61af66fc99e Initial load
duke
parents:
diff changeset
504 set_change_young_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
505 decrease_young_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 *desired_eden_size_ptr = *desired_eden_size_ptr -
a61af66fc99e Initial load
duke
parents:
diff changeset
507 eden_decrement_aligned_down(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
508 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // Only record that the estimator indicated such an action.
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // *desired_eden_size_ptr = *desired_eden_size_ptr + eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
512 set_change_young_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
513 increase_young_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 if (PSAdjustTenuredGenForMinorPause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // If the desired eden size is as small as it will get,
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // try to adjust the old gen size.
a61af66fc99e Initial load
duke
parents:
diff changeset
518 if (*desired_eden_size_ptr <= _intra_generation_alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // Vary the old gen size to reduce the young gen pause. This
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // may not be a good idea. This is just a test.
a61af66fc99e Initial load
duke
parents:
diff changeset
521 if (minor_pause_old_estimator()->decrement_will_decrease()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 set_change_old_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
523 decrease_old_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 *desired_promo_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
525 _promo_size - promo_decrement_aligned_down(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 set_change_old_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
528 increase_old_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
529 size_t promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
530 promo_increment_with_supplement_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if ((*desired_promo_size_ptr + promo_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
532 *desired_promo_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
533 *desired_promo_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
534 _promo_size + promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
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 void PSAdaptiveSizePolicy::adjust_for_pause_time(bool is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
542 size_t* desired_promo_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
543 size_t* desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 size_t promo_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 size_t eden_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // Add some checks for a threshhold for a change. For example,
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // a change less than the required alignment is probably not worth
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // attempting.
a61af66fc99e Initial load
duke
parents:
diff changeset
550 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
551 set_decide_at_full_gc(decide_at_full_gc_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (_avg_minor_pause->padded_average() > _avg_major_pause->padded_average()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 adjust_for_minor_pause_time(is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
556 desired_promo_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
557 desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // major pause adjustments
a61af66fc99e Initial load
duke
parents:
diff changeset
559 } else if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // Adjust for the major pause time only at full gc's because the
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // affects of a change can only be seen at full gc's.
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Reduce old generation size to reduce pause?
a61af66fc99e Initial load
duke
parents:
diff changeset
564 if (major_pause_old_estimator()->decrement_will_decrease()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // reduce old generation size
a61af66fc99e Initial load
duke
parents:
diff changeset
566 set_change_old_gen_for_maj_pauses(decrease_old_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
567 promo_heap_delta = promo_decrement_aligned_down(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
568 *desired_promo_size_ptr = _promo_size - promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
569 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // Only record that the estimator indicated such an action.
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // *desired_promo_size_ptr = _promo_size +
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // promo_increment_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 set_change_old_gen_for_maj_pauses(increase_old_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
576 if (PSAdjustYoungGenForMajorPause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // If the promo size is at the minimum (i.e., the old gen
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // size will not actually decrease), consider changing the
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // young gen size.
a61af66fc99e Initial load
duke
parents:
diff changeset
580 if (*desired_promo_size_ptr < _intra_generation_alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // If increasing the young generation will decrease the old gen
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // pause, do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // During startup there is noise in the statistics for deciding
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // on whether to increase or decrease the young gen size. For
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // some number of iterations, just try to increase the young
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // gen size if the major pause is too long to try and establish
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // good statistics for later decisions.
a61af66fc99e Initial load
duke
parents:
diff changeset
588 if (major_pause_young_estimator()->increment_will_decrease() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
589 (_young_gen_change_for_major_pause_count
a61af66fc99e Initial load
duke
parents:
diff changeset
590 <= AdaptiveSizePolicyInitializingSteps)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 set_change_young_gen_for_maj_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
592 increase_young_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 eden_heap_delta = eden_increment_aligned_up(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
594 *desired_eden_size_ptr = _eden_size + eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
595 _young_gen_change_for_major_pause_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // Record that decreasing the young gen size would decrease
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // the major pause
a61af66fc99e Initial load
duke
parents:
diff changeset
599 set_change_young_gen_for_maj_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
600 decrease_young_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 eden_heap_delta = eden_decrement_aligned_down(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 *desired_eden_size_ptr = _eden_size - eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
609 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
610 "AdaptiveSizePolicy::compute_generation_free_space "
a61af66fc99e Initial load
duke
parents:
diff changeset
611 "adjusting gen sizes for major pause (avg %f goal %f). "
a61af66fc99e Initial load
duke
parents:
diff changeset
612 "desired_promo_size " SIZE_FORMAT "desired_eden_size "
a61af66fc99e Initial load
duke
parents:
diff changeset
613 SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
614 " promo delta " SIZE_FORMAT " eden delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
615 _avg_major_pause->average(), gc_pause_goal_sec(),
a61af66fc99e Initial load
duke
parents:
diff changeset
616 *desired_promo_size_ptr, *desired_eden_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
617 promo_heap_delta, eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 void PSAdaptiveSizePolicy::adjust_for_throughput(bool is_full_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
622 size_t* desired_promo_size_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
623 size_t* desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // Add some checks for a threshhold for a change. For example,
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // a change less than the required alignment is probably not worth
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // attempting.
a61af66fc99e Initial load
duke
parents:
diff changeset
628 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
629 set_decide_at_full_gc(decide_at_full_gc_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 if ((gc_cost() + mutator_cost()) == 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 gclog_or_tty->print("\nPSAdaptiveSizePolicy::adjust_for_throughput("
a61af66fc99e Initial load
duke
parents:
diff changeset
638 "is_full: %d, promo: " SIZE_FORMAT ", cur_eden: " SIZE_FORMAT "): ",
a61af66fc99e Initial load
duke
parents:
diff changeset
639 is_full_gc, *desired_promo_size_ptr, *desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 gclog_or_tty->print_cr("mutator_cost %f major_gc_cost %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
641 "minor_gc_cost %f", mutator_cost(), major_gc_cost(), minor_gc_cost());
a61af66fc99e Initial load
duke
parents:
diff changeset
642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 // Tenured generation
a61af66fc99e Initial load
duke
parents:
diff changeset
645 if (is_full_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // Calculate the change to use for the tenured gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
648 size_t scaled_promo_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // Can the increment to the generation be scaled?
a61af66fc99e Initial load
duke
parents:
diff changeset
650 if (gc_cost() >= 0.0 && major_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
651 size_t promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
652 promo_increment_with_supplement_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 double scale_by_ratio = major_gc_cost() / gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
654 scaled_promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
655 (size_t) (scale_by_ratio * (double) promo_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
656 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
658 "Scaled tenured increment: " SIZE_FORMAT " by %f down to "
a61af66fc99e Initial load
duke
parents:
diff changeset
659 SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
660 promo_heap_delta, scale_by_ratio, scaled_promo_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662 } else if (major_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // Scaling is not going to work. If the major gc time is the
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // larger, give it a full increment.
a61af66fc99e Initial load
duke
parents:
diff changeset
665 if (major_gc_cost() >= minor_gc_cost()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 scaled_promo_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
667 promo_increment_with_supplement_aligned_up(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
669 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // Don't expect to get here but it's ok if it does
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // in the product build since the delta will be 0
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // and nothing will change.
a61af66fc99e Initial load
duke
parents:
diff changeset
673 assert(false, "Unexpected value for gc costs");
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 switch (AdaptiveSizeThroughPutPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // Early in the run the statistics might not be good. Until
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // a specific number of collections have been, use the heuristic
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // that a larger generation size means lower collection costs.
a61af66fc99e Initial load
duke
parents:
diff changeset
681 if (major_collection_estimator()->increment_will_decrease() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
682 (_old_gen_change_for_major_throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
683 <= AdaptiveSizePolicyInitializingSteps)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // Increase tenured generation size to reduce major collection cost
a61af66fc99e Initial load
duke
parents:
diff changeset
685 if ((*desired_promo_size_ptr + scaled_promo_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
686 *desired_promo_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 *desired_promo_size_ptr = _promo_size + scaled_promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
689 set_change_old_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
690 increase_old_gen_for_throughput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
691 _old_gen_change_for_major_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
692 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // Record that decreasing the old gen size would decrease
a61af66fc99e Initial load
duke
parents:
diff changeset
695 // the major collection cost but don't do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // *desired_promo_size_ptr = _promo_size -
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // promo_decrement_aligned_down(*desired_promo_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
698 set_change_old_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
699 decrease_old_gen_for_throughput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
701
a61af66fc99e Initial load
duke
parents:
diff changeset
702 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
703 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Simplest strategy
a61af66fc99e Initial load
duke
parents:
diff changeset
705 if ((*desired_promo_size_ptr + scaled_promo_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
706 *desired_promo_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
707 *desired_promo_size_ptr = *desired_promo_size_ptr +
a61af66fc99e Initial load
duke
parents:
diff changeset
708 scaled_promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
710 set_change_old_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
711 increase_old_gen_for_throughput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
712 _old_gen_change_for_major_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
714
a61af66fc99e Initial load
duke
parents:
diff changeset
715 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
716 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
717 "adjusting tenured gen for throughput (avg %f goal %f). "
a61af66fc99e Initial load
duke
parents:
diff changeset
718 "desired_promo_size " SIZE_FORMAT " promo_delta " SIZE_FORMAT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
719 mutator_cost(), _throughput_goal,
a61af66fc99e Initial load
duke
parents:
diff changeset
720 *desired_promo_size_ptr, scaled_promo_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // Young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
725 size_t scaled_eden_heap_delta = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
726 // Can the increment to the generation be scaled?
a61af66fc99e Initial load
duke
parents:
diff changeset
727 if (gc_cost() >= 0.0 && minor_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 size_t eden_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
729 eden_increment_with_supplement_aligned_up(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 double scale_by_ratio = minor_gc_cost() / gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
731 assert(scale_by_ratio <= 1.0 && scale_by_ratio >= 0.0, "Scaling is wrong");
a61af66fc99e Initial load
duke
parents:
diff changeset
732 scaled_eden_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
733 (size_t) (scale_by_ratio * (double) eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
734 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
736 "Scaled eden increment: " SIZE_FORMAT " by %f down to "
a61af66fc99e Initial load
duke
parents:
diff changeset
737 SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
738 eden_heap_delta, scale_by_ratio, scaled_eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740 } else if (minor_gc_cost() >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // Scaling is not going to work. If the minor gc time is the
a61af66fc99e Initial load
duke
parents:
diff changeset
742 // larger, give it a full increment.
a61af66fc99e Initial load
duke
parents:
diff changeset
743 if (minor_gc_cost() > major_gc_cost()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 scaled_eden_heap_delta =
a61af66fc99e Initial load
duke
parents:
diff changeset
745 eden_increment_with_supplement_aligned_up(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // Don't expect to get here but it's ok if it does
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // in the product build since the delta will be 0
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // and nothing will change.
a61af66fc99e Initial load
duke
parents:
diff changeset
751 assert(false, "Unexpected value for gc costs");
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // Use a heuristic for some number of collections to give
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // the averages time to settle down.
a61af66fc99e Initial load
duke
parents:
diff changeset
756 switch (AdaptiveSizeThroughPutPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
758 if (minor_collection_estimator()->increment_will_decrease() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
759 (_young_gen_change_for_minor_throughput
a61af66fc99e Initial load
duke
parents:
diff changeset
760 <= AdaptiveSizePolicyInitializingSteps)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Expand young generation size to reduce frequency of
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // of collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
763 if ((*desired_eden_size_ptr + scaled_eden_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
764 *desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
765 *desired_eden_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
766 *desired_eden_size_ptr + scaled_eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
768 set_change_young_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
769 increase_young_gen_for_througput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
770 _young_gen_change_for_minor_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
771 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // EXPERIMENTAL ADJUSTMENT
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // Record that decreasing the young gen size would decrease
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // the minor collection cost but don't do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // *desired_eden_size_ptr = _eden_size -
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // eden_decrement_aligned_down(*desired_eden_size_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
777 set_change_young_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
778 decrease_young_gen_for_througput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 }
a61af66fc99e Initial load
duke
parents:
diff changeset
780 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
782 if ((*desired_eden_size_ptr + scaled_eden_heap_delta) >
a61af66fc99e Initial load
duke
parents:
diff changeset
783 *desired_eden_size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 *desired_eden_size_ptr =
a61af66fc99e Initial load
duke
parents:
diff changeset
785 *desired_eden_size_ptr + scaled_eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
787 set_change_young_gen_for_throughput(
a61af66fc99e Initial load
duke
parents:
diff changeset
788 increase_young_gen_for_througput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
789 _young_gen_change_for_minor_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
794 "adjusting eden for throughput (avg %f goal %f). desired_eden_size "
a61af66fc99e Initial load
duke
parents:
diff changeset
795 SIZE_FORMAT " eden delta " SIZE_FORMAT "\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
796 mutator_cost(), _throughput_goal,
a61af66fc99e Initial load
duke
parents:
diff changeset
797 *desired_eden_size_ptr, scaled_eden_heap_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 size_t PSAdaptiveSizePolicy::adjust_promo_for_footprint(
a61af66fc99e Initial load
duke
parents:
diff changeset
802 size_t desired_promo_size, size_t desired_sum) {
a61af66fc99e Initial load
duke
parents:
diff changeset
803 assert(desired_promo_size <= desired_sum, "Inconsistent parameters");
a61af66fc99e Initial load
duke
parents:
diff changeset
804 set_decrease_for_footprint(decrease_old_gen_for_footprint_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 size_t change = promo_decrement(desired_promo_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 change = scale_down(change, desired_promo_size, desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 size_t reduced_size = desired_promo_size - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
813 "AdaptiveSizePolicy::compute_generation_free_space "
a61af66fc99e Initial load
duke
parents:
diff changeset
814 "adjusting tenured gen for footprint. "
a61af66fc99e Initial load
duke
parents:
diff changeset
815 "starting promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
816 " reduced promo size " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
817 " promo delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
818 desired_promo_size, reduced_size, change );
a61af66fc99e Initial load
duke
parents:
diff changeset
819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 assert(reduced_size <= desired_promo_size, "Inconsistent result");
a61af66fc99e Initial load
duke
parents:
diff changeset
822 return reduced_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 size_t PSAdaptiveSizePolicy::adjust_eden_for_footprint(
a61af66fc99e Initial load
duke
parents:
diff changeset
826 size_t desired_eden_size, size_t desired_sum) {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 assert(desired_eden_size <= desired_sum, "Inconsistent parameters");
a61af66fc99e Initial load
duke
parents:
diff changeset
828 set_decrease_for_footprint(decrease_young_gen_for_footprint_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 size_t change = eden_decrement(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
831 change = scale_down(change, desired_eden_size, desired_sum);
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 size_t reduced_size = desired_eden_size - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
837 "AdaptiveSizePolicy::compute_generation_free_space "
a61af66fc99e Initial load
duke
parents:
diff changeset
838 "adjusting eden for footprint. "
a61af66fc99e Initial load
duke
parents:
diff changeset
839 " starting eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
840 " reduced eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
841 " eden delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
842 desired_eden_size, reduced_size, change);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844
a61af66fc99e Initial load
duke
parents:
diff changeset
845 assert(reduced_size <= desired_eden_size, "Inconsistent result");
a61af66fc99e Initial load
duke
parents:
diff changeset
846 return reduced_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // Scale down "change" by the factor
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // part / total
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // Don't align the results.
a61af66fc99e Initial load
duke
parents:
diff changeset
852
a61af66fc99e Initial load
duke
parents:
diff changeset
853 size_t PSAdaptiveSizePolicy::scale_down(size_t change,
a61af66fc99e Initial load
duke
parents:
diff changeset
854 double part,
a61af66fc99e Initial load
duke
parents:
diff changeset
855 double total) {
a61af66fc99e Initial load
duke
parents:
diff changeset
856 assert(part <= total, "Inconsistent input");
a61af66fc99e Initial load
duke
parents:
diff changeset
857 size_t reduced_change = change;
a61af66fc99e Initial load
duke
parents:
diff changeset
858 if (total > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 double fraction = part / total;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 reduced_change = (size_t) (fraction * (double) change);
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 assert(reduced_change <= change, "Inconsistent result");
a61af66fc99e Initial load
duke
parents:
diff changeset
863 return reduced_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 size_t PSAdaptiveSizePolicy::eden_increment(size_t cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
867 uint percent_change) {
a61af66fc99e Initial load
duke
parents:
diff changeset
868 size_t eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
869 eden_heap_delta = cur_eden / 100 * percent_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 return eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 size_t PSAdaptiveSizePolicy::eden_increment(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 return eden_increment(cur_eden, YoungGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 size_t PSAdaptiveSizePolicy::eden_increment_aligned_up(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
878 size_t result = eden_increment(cur_eden, YoungGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
879 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 size_t PSAdaptiveSizePolicy::eden_increment_aligned_down(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
883 size_t result = eden_increment(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
884 return align_size_down(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 size_t PSAdaptiveSizePolicy::eden_increment_with_supplement_aligned_up(
a61af66fc99e Initial load
duke
parents:
diff changeset
888 size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
889 size_t result = eden_increment(cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
890 YoungGenerationSizeIncrement + _young_gen_size_increment_supplement);
a61af66fc99e Initial load
duke
parents:
diff changeset
891 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
892 }
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 size_t PSAdaptiveSizePolicy::eden_decrement_aligned_down(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 size_t eden_heap_delta = eden_decrement(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 return align_size_down(eden_heap_delta, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
898
a61af66fc99e Initial load
duke
parents:
diff changeset
899 size_t PSAdaptiveSizePolicy::eden_decrement(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
900 size_t eden_heap_delta = eden_increment(cur_eden) /
a61af66fc99e Initial load
duke
parents:
diff changeset
901 AdaptiveSizeDecrementScaleFactor;
a61af66fc99e Initial load
duke
parents:
diff changeset
902 return eden_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 size_t PSAdaptiveSizePolicy::promo_increment(size_t cur_promo,
a61af66fc99e Initial load
duke
parents:
diff changeset
906 uint percent_change) {
a61af66fc99e Initial load
duke
parents:
diff changeset
907 size_t promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
908 promo_heap_delta = cur_promo / 100 * percent_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
909 return promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 size_t PSAdaptiveSizePolicy::promo_increment(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
913 return promo_increment(cur_promo, TenuredGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 size_t PSAdaptiveSizePolicy::promo_increment_aligned_up(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
917 size_t result = promo_increment(cur_promo, TenuredGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
918 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
920
a61af66fc99e Initial load
duke
parents:
diff changeset
921 size_t PSAdaptiveSizePolicy::promo_increment_aligned_down(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
922 size_t result = promo_increment(cur_promo, TenuredGenerationSizeIncrement);
a61af66fc99e Initial load
duke
parents:
diff changeset
923 return align_size_down(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 size_t PSAdaptiveSizePolicy::promo_increment_with_supplement_aligned_up(
a61af66fc99e Initial load
duke
parents:
diff changeset
927 size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
928 size_t result = promo_increment(cur_promo,
a61af66fc99e Initial load
duke
parents:
diff changeset
929 TenuredGenerationSizeIncrement + _old_gen_size_increment_supplement);
a61af66fc99e Initial load
duke
parents:
diff changeset
930 return align_size_up(result, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 size_t PSAdaptiveSizePolicy::promo_decrement_aligned_down(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
934 size_t promo_heap_delta = promo_decrement(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
935 return align_size_down(promo_heap_delta, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 size_t PSAdaptiveSizePolicy::promo_decrement(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
939 size_t promo_heap_delta = promo_increment(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
940 promo_heap_delta = promo_heap_delta / AdaptiveSizeDecrementScaleFactor;
a61af66fc99e Initial load
duke
parents:
diff changeset
941 return promo_heap_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
6818
22b8d3d181d9 8000351: Tenuring threshold should be unsigned
jwilhelm
parents: 6725
diff changeset
944 uint PSAdaptiveSizePolicy::compute_survivor_space_size_and_threshold(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
945 bool is_survivor_overflow,
6818
22b8d3d181d9 8000351: Tenuring threshold should be unsigned
jwilhelm
parents: 6725
diff changeset
946 uint tenuring_threshold,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
947 size_t survivor_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
948 assert(survivor_limit >= _intra_generation_alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
949 "survivor_limit too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
950 assert((size_t)align_size_down(survivor_limit, _intra_generation_alignment)
a61af66fc99e Initial load
duke
parents:
diff changeset
951 == survivor_limit, "survivor_limit not aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
952
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // This method is called even if the tenuring threshold and survivor
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // spaces are not adjusted so that the averages are sampled above.
a61af66fc99e Initial load
duke
parents:
diff changeset
955 if (!UsePSAdaptiveSurvivorSizePolicy ||
a61af66fc99e Initial load
duke
parents:
diff changeset
956 !young_gen_policy_is_ready()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 return tenuring_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // We'll decide whether to increase or decrease the tenuring
a61af66fc99e Initial load
duke
parents:
diff changeset
961 // threshold based partly on the newly computed survivor size
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // (if we hit the maximum limit allowed, we'll always choose to
a61af66fc99e Initial load
duke
parents:
diff changeset
963 // decrement the threshold).
a61af66fc99e Initial load
duke
parents:
diff changeset
964 bool incr_tenuring_threshold = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
965 bool decr_tenuring_threshold = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 set_decrement_tenuring_threshold_for_gc_cost(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
968 set_increment_tenuring_threshold_for_gc_cost(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
969 set_decrement_tenuring_threshold_for_survivor_limit(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971 if (!is_survivor_overflow) {
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // Keep running averages on how much survived
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // We use the tenuring threshold to equalize the cost of major
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // and minor collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // ThresholdTolerance is used to indicate how sensitive the
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // tenuring threshold is to differences in cost betweent the
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // collection types.
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980 // Get the times of interest. This involves a little work, so
a61af66fc99e Initial load
duke
parents:
diff changeset
981 // we cache the values here.
a61af66fc99e Initial load
duke
parents:
diff changeset
982 const double major_cost = major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
983 const double minor_cost = minor_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
984
a61af66fc99e Initial load
duke
parents:
diff changeset
985 if (minor_cost > major_cost * _threshold_tolerance_percent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
986 // Minor times are getting too long; lower the threshold so
a61af66fc99e Initial load
duke
parents:
diff changeset
987 // less survives and more is promoted.
a61af66fc99e Initial load
duke
parents:
diff changeset
988 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
989 set_decrement_tenuring_threshold_for_gc_cost(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
990 } else if (major_cost > minor_cost * _threshold_tolerance_percent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // Major times are too long, so we want less promotion.
a61af66fc99e Initial load
duke
parents:
diff changeset
992 incr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
993 set_increment_tenuring_threshold_for_gc_cost(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // Survivor space overflow occurred, so promoted and survived are
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // not accurate. We'll make our best guess by combining survived
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // and promoted and count them as survivors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 // We'll lower the tenuring threshold to see if we can correct
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // things. Also, set the survivor size conservatively. We're
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 // trying to avoid many overflows from occurring if defnew size
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 // is just too small.
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 // The padded average also maintains a deviation from the average;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // we use this to see how good of an estimate we have of what survived.
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // We're trying to pad the survivor size as little as possible without
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 // overflowing the survivor spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 size_t target_size = align_size_up((size_t)_avg_survived->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 target_size = MAX2(target_size, _intra_generation_alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 if (target_size > survivor_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 // Target size is bigger than we can handle. Let's also reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // the tenuring threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 target_size = survivor_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 set_decrement_tenuring_threshold_for_survivor_limit(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // Finally, increment or decrement the tenuring threshold, as decided above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 // We test for decrementing first, as we might have hit the target size
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 // limit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 if (decr_tenuring_threshold && !(AlwaysTenure || NeverTenure)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 if (tenuring_threshold > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 tenuring_threshold--;
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 } else if (incr_tenuring_threshold && !(AlwaysTenure || NeverTenure)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 if (tenuring_threshold < MaxTenuringThreshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 tenuring_threshold++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // We keep a running average of the amount promoted which is used
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // to decide when we should collect the old generation (when
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 // the amount of old gen free space is less than what we expect to
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 // promote).
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 // A little more detail if Verbose is on
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 gclog_or_tty->print( " avg_survived: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 " avg_deviation: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 _avg_survived->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 _avg_survived->deviation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 gclog_or_tty->print( " avg_survived_padded_avg: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 _avg_survived->padded_average());
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 gclog_or_tty->print( " avg_promoted_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 " avg_promoted_dev: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 avg_promoted()->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 avg_promoted()->deviation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 gclog_or_tty->print( " avg_promoted_padded_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 " avg_pretenured_padded_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 " tenuring_thresh: %d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 " target_size: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 avg_promoted()->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 _avg_pretenured->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 tenuring_threshold, target_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 set_survivor_size(target_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 return tenuring_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 void PSAdaptiveSizePolicy::update_averages(bool is_survivor_overflow,
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 size_t survived,
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 size_t promoted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // Update averages
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if (!is_survivor_overflow) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 // Keep running averages on how much survived
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 _avg_survived->sample(survived);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 size_t survived_guess = survived + promoted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 _avg_survived->sample(survived_guess);
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 avg_promoted()->sample(promoted + _avg_pretenured->padded_average());
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 gclog_or_tty->print(
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 "AdaptiveSizePolicy::compute_survivor_space_size_and_thresh:"
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 " survived: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 " promoted: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 " overflow: %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 survived, promoted, is_survivor_overflow ? "true" : "false");
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 bool PSAdaptiveSizePolicy::print_adaptive_size_policy_on(outputStream* st)
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 if (!UseAdaptiveSizePolicy) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1104
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 return AdaptiveSizePolicy::print_adaptive_size_policy_on(
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 st,
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 PSScavenge::tenuring_threshold());
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 }