annotate src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents a61af66fc99e
children 5f1f51edaff6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_cmsAdaptiveSizePolicy.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 elapsedTimer CMSAdaptiveSizePolicy::_concurrent_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 elapsedTimer CMSAdaptiveSizePolicy::_STW_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // Defined if the granularity of the time measurements is potentially too large.
a61af66fc99e Initial load
duke
parents:
diff changeset
31 #define CLOCK_GRANULARITY_TOO_LARGE
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 CMSAdaptiveSizePolicy::CMSAdaptiveSizePolicy(size_t init_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
34 size_t init_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
35 size_t init_survivor_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
36 double max_gc_minor_pause_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
37 double max_gc_pause_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
38 uint gc_cost_ratio) :
a61af66fc99e Initial load
duke
parents:
diff changeset
39 AdaptiveSizePolicy(init_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 init_promo_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 init_survivor_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
42 max_gc_pause_sec,
a61af66fc99e Initial load
duke
parents:
diff changeset
43 gc_cost_ratio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 clear_internal_time_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _processor_count = os::active_processor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 if (CMSConcurrentMTEnabled && (ParallelCMSThreads > 1)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 assert(_processor_count > 0, "Processor count is suspect");
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _concurrent_processor_count = MIN2((uint) ParallelCMSThreads,
a61af66fc99e Initial load
duke
parents:
diff changeset
52 (uint) _processor_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
53 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 _concurrent_processor_count = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _avg_concurrent_time = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _avg_concurrent_interval = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _avg_concurrent_gc_cost = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 _avg_initial_pause = new AdaptivePaddedAverage(AdaptiveTimeWeight,
a61af66fc99e Initial load
duke
parents:
diff changeset
62 PausePadding);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _avg_remark_pause = new AdaptivePaddedAverage(AdaptiveTimeWeight,
a61af66fc99e Initial load
duke
parents:
diff changeset
64 PausePadding);
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _avg_cms_STW_time = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
67 _avg_cms_STW_gc_cost = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _avg_cms_free = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _avg_cms_free_at_sweep = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _avg_cms_promo = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Mark-sweep-compact
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _avg_msc_pause = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _avg_msc_interval = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _avg_msc_gc_cost = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // Mark-sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _avg_ms_pause = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 _avg_ms_interval = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _avg_ms_gc_cost = new AdaptiveWeightedAverage(AdaptiveTimeWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Variables that estimate pause times as a function of generation
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // size.
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _remark_pause_old_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
86 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 _initial_pause_old_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
88 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _remark_pause_young_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
90 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _initial_pause_young_estimator =
a61af66fc99e Initial load
duke
parents:
diff changeset
92 new LinearLeastSquareFit(AdaptiveSizePolicyWeight);
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Alignment comes from that used in ReservedSpace.
a61af66fc99e Initial load
duke
parents:
diff changeset
95 _generation_alignment = os::vm_allocation_granularity();
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Start the concurrent timer here so that the first
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // concurrent_phases_begin() measures a finite mutator
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // time. A finite mutator time is used to determine
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // if a concurrent collection has been started. If this
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // proves to be a problem, use some explicit flag to
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // signal that a concurrent collection has been started.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 double CMSAdaptiveSizePolicy::concurrent_processor_fraction() {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // For now assume no other daemon threads are taking alway
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // cpu's from the application.
a61af66fc99e Initial load
duke
parents:
diff changeset
110 return ((double) _concurrent_processor_count / (double) _processor_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 double CMSAdaptiveSizePolicy::concurrent_collection_cost(
a61af66fc99e Initial load
duke
parents:
diff changeset
114 double interval_in_seconds) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // When the precleaning and sweeping phases use multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // threads, change one_processor_fraction to
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // concurrent_processor_fraction().
a61af66fc99e Initial load
duke
parents:
diff changeset
118 double one_processor_fraction = 1.0 / ((double) processor_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
119 double concurrent_cost =
a61af66fc99e Initial load
duke
parents:
diff changeset
120 collection_cost(_latest_cms_concurrent_marking_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
121 interval_in_seconds) * concurrent_processor_fraction() +
a61af66fc99e Initial load
duke
parents:
diff changeset
122 collection_cost(_latest_cms_concurrent_precleaning_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
123 interval_in_seconds) * one_processor_fraction +
a61af66fc99e Initial load
duke
parents:
diff changeset
124 collection_cost(_latest_cms_concurrent_sweeping_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
125 interval_in_seconds) * one_processor_fraction;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
128 "\nCMSAdaptiveSizePolicy::scaled_concurrent_collection_cost(%f) "
a61af66fc99e Initial load
duke
parents:
diff changeset
129 "_latest_cms_concurrent_marking_cost %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
130 "_latest_cms_concurrent_precleaning_cost %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
131 "_latest_cms_concurrent_sweeping_cost %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
132 "concurrent_processor_fraction %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
133 "concurrent_cost %f ",
a61af66fc99e Initial load
duke
parents:
diff changeset
134 interval_in_seconds,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 collection_cost(_latest_cms_concurrent_marking_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 interval_in_seconds),
a61af66fc99e Initial load
duke
parents:
diff changeset
137 collection_cost(_latest_cms_concurrent_precleaning_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
138 interval_in_seconds),
a61af66fc99e Initial load
duke
parents:
diff changeset
139 collection_cost(_latest_cms_concurrent_sweeping_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
140 interval_in_seconds),
a61af66fc99e Initial load
duke
parents:
diff changeset
141 concurrent_processor_fraction(),
a61af66fc99e Initial load
duke
parents:
diff changeset
142 concurrent_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 return concurrent_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 double CMSAdaptiveSizePolicy::concurrent_collection_time() {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 double latest_cms_sum_concurrent_phases_time_secs =
a61af66fc99e Initial load
duke
parents:
diff changeset
149 _latest_cms_concurrent_marking_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
150 _latest_cms_concurrent_precleaning_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
151 _latest_cms_concurrent_sweeping_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return latest_cms_sum_concurrent_phases_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 double CMSAdaptiveSizePolicy::scaled_concurrent_collection_time() {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // When the precleaning and sweeping phases use multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // threads, change one_processor_fraction to
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // concurrent_processor_fraction().
a61af66fc99e Initial load
duke
parents:
diff changeset
159 double one_processor_fraction = 1.0 / ((double) processor_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
160 double latest_cms_sum_concurrent_phases_time_secs =
a61af66fc99e Initial load
duke
parents:
diff changeset
161 _latest_cms_concurrent_marking_time_secs * concurrent_processor_fraction() +
a61af66fc99e Initial load
duke
parents:
diff changeset
162 _latest_cms_concurrent_precleaning_time_secs * one_processor_fraction +
a61af66fc99e Initial load
duke
parents:
diff changeset
163 _latest_cms_concurrent_sweeping_time_secs * one_processor_fraction ;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
166 "\nCMSAdaptiveSizePolicy::scaled_concurrent_collection_time "
a61af66fc99e Initial load
duke
parents:
diff changeset
167 "_latest_cms_concurrent_marking_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
168 "_latest_cms_concurrent_precleaning_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
169 "_latest_cms_concurrent_sweeping_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
170 "concurrent_processor_fraction %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
171 "latest_cms_sum_concurrent_phases_time_secs %f ",
a61af66fc99e Initial load
duke
parents:
diff changeset
172 _latest_cms_concurrent_marking_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
173 _latest_cms_concurrent_precleaning_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
174 _latest_cms_concurrent_sweeping_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
175 concurrent_processor_fraction(),
a61af66fc99e Initial load
duke
parents:
diff changeset
176 latest_cms_sum_concurrent_phases_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return latest_cms_sum_concurrent_phases_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void CMSAdaptiveSizePolicy::update_minor_pause_old_estimator(
a61af66fc99e Initial load
duke
parents:
diff changeset
182 double minor_pause_in_ms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Get the equivalent of the free space
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // that is available for promotions in the CMS generation
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // and use that to update _minor_pause_old_estimator
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // Don't implement this until it is needed. A warning is
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // printed if _minor_pause_old_estimator is used.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 void CMSAdaptiveSizePolicy::concurrent_marking_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
194 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
195 gclog_or_tty->print(": concurrent_marking_begin ");
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Update the interval time
a61af66fc99e Initial load
duke
parents:
diff changeset
198 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
199 _latest_cms_collection_end_to_collection_start_secs = _concurrent_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::concurrent_marking_begin: "
a61af66fc99e Initial load
duke
parents:
diff changeset
202 "mutator time %f", _latest_cms_collection_end_to_collection_start_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 _concurrent_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
205 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 void CMSAdaptiveSizePolicy::concurrent_marking_end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
211 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::concurrent_marking_end()");
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 _latest_cms_concurrent_marking_time_secs = _concurrent_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 gclog_or_tty->print_cr("\n CMSAdaptiveSizePolicy::concurrent_marking_end"
a61af66fc99e Initial load
duke
parents:
diff changeset
219 ":concurrent marking time (s) %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
220 _latest_cms_concurrent_marking_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void CMSAdaptiveSizePolicy::concurrent_precleaning_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
227 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
228 "CMSAdaptiveSizePolicy::concurrent_precleaning_begin()");
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 _concurrent_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
231 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 void CMSAdaptiveSizePolicy::concurrent_precleaning_end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
238 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::concurrent_precleaning_end()");
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // May be set again by a second call during the same collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
243 _latest_cms_concurrent_precleaning_time_secs = _concurrent_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 gclog_or_tty->print_cr("\n CMSAdaptiveSizePolicy::concurrent_precleaning_end"
a61af66fc99e Initial load
duke
parents:
diff changeset
247 ":concurrent precleaning time (s) %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
248 _latest_cms_concurrent_precleaning_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void CMSAdaptiveSizePolicy::concurrent_sweeping_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
255 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
256 "CMSAdaptiveSizePolicy::concurrent_sweeping_begin()");
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 _concurrent_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 void CMSAdaptiveSizePolicy::concurrent_sweeping_end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
266 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::concurrent_sweeping_end()");
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
270 _latest_cms_concurrent_sweeping_time_secs = _concurrent_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 gclog_or_tty->print_cr("\n CMSAdaptiveSizePolicy::concurrent_sweeping_end"
a61af66fc99e Initial load
duke
parents:
diff changeset
274 ":concurrent sweeping time (s) %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
275 _latest_cms_concurrent_sweeping_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 void CMSAdaptiveSizePolicy::concurrent_phases_end(GCCause::Cause gc_cause,
a61af66fc99e Initial load
duke
parents:
diff changeset
280 size_t cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
281 size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
284 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 gclog_or_tty->print(": concurrent_phases_end ");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // Update the concurrent timer
a61af66fc99e Initial load
duke
parents:
diff changeset
289 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
292 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 avg_cms_free()->sample(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 double latest_cms_sum_concurrent_phases_time_secs =
a61af66fc99e Initial load
duke
parents:
diff changeset
296 concurrent_collection_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 _avg_concurrent_time->sample(latest_cms_sum_concurrent_phases_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // Cost of collection (unit-less)
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // Total interval for collection. May not be valid. Tests
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // below determine whether to use this.
a61af66fc99e Initial load
duke
parents:
diff changeset
304 //
a61af66fc99e Initial load
duke
parents:
diff changeset
305 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 gclog_or_tty->print_cr("\nCMSAdaptiveSizePolicy::concurrent_phases_end \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
307 "_latest_cms_reset_end_to_initial_mark_start_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
308 "_latest_cms_initial_mark_start_to_end_time_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
309 "_latest_cms_remark_start_to_end_time_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
310 "_latest_cms_concurrent_marking_time_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
311 "_latest_cms_concurrent_precleaning_time_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
312 "_latest_cms_concurrent_sweeping_time_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
313 "latest_cms_sum_concurrent_phases_time_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
314 "_latest_cms_collection_end_to_collection_start_secs %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
315 "concurrent_processor_fraction %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
316 _latest_cms_reset_end_to_initial_mark_start_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
317 _latest_cms_initial_mark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
318 _latest_cms_remark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
319 _latest_cms_concurrent_marking_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
320 _latest_cms_concurrent_precleaning_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
321 _latest_cms_concurrent_sweeping_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
322 latest_cms_sum_concurrent_phases_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
323 _latest_cms_collection_end_to_collection_start_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
324 concurrent_processor_fraction());
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 double interval_in_seconds =
a61af66fc99e Initial load
duke
parents:
diff changeset
327 _latest_cms_initial_mark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
328 _latest_cms_remark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
329 latest_cms_sum_concurrent_phases_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
330 _latest_cms_collection_end_to_collection_start_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 assert(interval_in_seconds >= 0.0,
a61af66fc99e Initial load
duke
parents:
diff changeset
332 "Bad interval between cms collections");
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Sample for performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
335 avg_concurrent_interval()->sample(interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // STW costs (initial and remark pauses)
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Cost of collection (unit-less)
a61af66fc99e Initial load
duke
parents:
diff changeset
339 assert(_latest_cms_initial_mark_start_to_end_time_secs >= 0.0,
a61af66fc99e Initial load
duke
parents:
diff changeset
340 "Bad initial mark pause");
a61af66fc99e Initial load
duke
parents:
diff changeset
341 assert(_latest_cms_remark_start_to_end_time_secs >= 0.0,
a61af66fc99e Initial load
duke
parents:
diff changeset
342 "Bad remark pause");
a61af66fc99e Initial load
duke
parents:
diff changeset
343 double STW_time_in_seconds =
a61af66fc99e Initial load
duke
parents:
diff changeset
344 _latest_cms_initial_mark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
345 _latest_cms_remark_start_to_end_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 double STW_collection_cost = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 if (interval_in_seconds > 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // cost for the STW phases of the concurrent collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
349 STW_collection_cost = STW_time_in_seconds / interval_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 avg_cms_STW_gc_cost()->sample(STW_collection_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 gclog_or_tty->print("cmsAdaptiveSizePolicy::STW_collection_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
354 "STW gc cost: %f average: %f", STW_collection_cost,
a61af66fc99e Initial load
duke
parents:
diff changeset
355 avg_cms_STW_gc_cost()->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
356 gclog_or_tty->print_cr(" STW pause: %f (ms) STW period %f (ms)",
a61af66fc99e Initial load
duke
parents:
diff changeset
357 (double) STW_time_in_seconds * MILLIUNITS,
a61af66fc99e Initial load
duke
parents:
diff changeset
358 (double) interval_in_seconds * MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 double concurrent_cost = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (latest_cms_sum_concurrent_phases_time_secs > 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 concurrent_cost = concurrent_collection_cost(interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 avg_concurrent_gc_cost()->sample(concurrent_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // Average this ms cost into all the other types gc costs
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 gclog_or_tty->print("cmsAdaptiveSizePolicy::concurrent_phases_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
370 "concurrent gc cost: %f average: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
371 concurrent_cost,
a61af66fc99e Initial load
duke
parents:
diff changeset
372 _avg_concurrent_gc_cost->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
373 gclog_or_tty->print_cr(" concurrent time: %f (ms) cms period %f (ms)"
a61af66fc99e Initial load
duke
parents:
diff changeset
374 " processor fraction: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
375 latest_cms_sum_concurrent_phases_time_secs * MILLIUNITS,
a61af66fc99e Initial load
duke
parents:
diff changeset
376 interval_in_seconds * MILLIUNITS,
a61af66fc99e Initial load
duke
parents:
diff changeset
377 concurrent_processor_fraction());
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 double total_collection_cost = STW_collection_cost + concurrent_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 avg_major_gc_cost()->sample(total_collection_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // Gather information for estimating future behavior
a61af66fc99e Initial load
duke
parents:
diff changeset
384 double initial_pause_in_ms = _latest_cms_initial_mark_start_to_end_time_secs * MILLIUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
385 double remark_pause_in_ms = _latest_cms_remark_start_to_end_time_secs * MILLIUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 double cur_promo_size_in_mbytes = ((double)cur_promo)/((double)M);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 initial_pause_old_estimator()->update(cur_promo_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
389 initial_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
390 remark_pause_old_estimator()->update(cur_promo_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
391 remark_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 major_collection_estimator()->update(cur_promo_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
393 total_collection_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // This estimate uses the average eden size. It could also
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // have used the latest eden size. Which is better?
a61af66fc99e Initial load
duke
parents:
diff changeset
397 double cur_eden_size_in_mbytes = ((double)cur_eden)/((double) M);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 initial_pause_young_estimator()->update(cur_eden_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
399 initial_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
400 remark_pause_young_estimator()->update(cur_eden_size_in_mbytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
401 remark_pause_in_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 clear_internal_time_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 set_first_after_collection();
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // The concurrent phases keeps track of it's own mutator interval
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // with this timer. This allows the stop-the-world phase to
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // be included in the mutator time so that the stop-the-world time
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // is not double counted. Reset and start it.
a61af66fc99e Initial load
duke
parents:
diff changeset
412 _concurrent_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
413 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // The mutator time between STW phases does not include the
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // concurrent collection time.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
418 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 void CMSAdaptiveSizePolicy::checkpoint_roots_initial_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Update the interval time
a61af66fc99e Initial load
duke
parents:
diff changeset
423 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
424 _latest_cms_reset_end_to_initial_mark_start_secs = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Reset for the initial mark
a61af66fc99e Initial load
duke
parents:
diff changeset
426 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
427 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 void CMSAdaptiveSizePolicy::checkpoint_roots_initial_end(
a61af66fc99e Initial load
duke
parents:
diff changeset
431 GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
435 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
436 _latest_cms_initial_mark_start_to_end_time_secs = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
437 avg_initial_pause()->sample(_latest_cms_initial_mark_start_to_end_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 gclog_or_tty->print(
a61af66fc99e Initial load
duke
parents:
diff changeset
441 "cmsAdaptiveSizePolicy::checkpoint_roots_initial_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
442 "initial pause: %f ", _latest_cms_initial_mark_start_to_end_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
447 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 void CMSAdaptiveSizePolicy::checkpoint_roots_final_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
452 _latest_cms_initial_mark_end_to_remark_start_secs = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Start accumumlating time for the remark in the STW timer.
a61af66fc99e Initial load
duke
parents:
diff changeset
454 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
455 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 void CMSAdaptiveSizePolicy::checkpoint_roots_final_end(
a61af66fc99e Initial load
duke
parents:
diff changeset
459 GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
461 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
462 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // Total initial mark pause + remark pause.
a61af66fc99e Initial load
duke
parents:
diff changeset
464 _latest_cms_remark_start_to_end_time_secs = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
465 double STW_time_in_seconds = _latest_cms_initial_mark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
466 _latest_cms_remark_start_to_end_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 double STW_time_in_ms = STW_time_in_seconds * MILLIUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 avg_remark_pause()->sample(_latest_cms_remark_start_to_end_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // Sample total for initial mark + remark
a61af66fc99e Initial load
duke
parents:
diff changeset
472 avg_cms_STW_time()->sample(STW_time_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 gclog_or_tty->print("cmsAdaptiveSizePolicy::checkpoint_roots_final_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
476 "remark pause: %f", _latest_cms_remark_start_to_end_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // Don't start the STW times here because the concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // sweep and reset has not happened.
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // Keep the old comment above in case I don't understand
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // what is going on but now
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Start the STW timer because it is used by ms_collection_begin()
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // and ms_collection_end() to get the sweep time if a MS is being
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // done in the foreground.
a61af66fc99e Initial load
duke
parents:
diff changeset
487 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
488 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 void CMSAdaptiveSizePolicy::msc_collection_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
493 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
494 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
495 gclog_or_tty->print(": msc_collection_begin ");
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
498 _latest_cms_msc_end_to_msc_start_time_secs = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
499 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::msc_collection_begin: "
a61af66fc99e Initial load
duke
parents:
diff changeset
501 "mutator time %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
502 _latest_cms_msc_end_to_msc_start_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504 avg_msc_interval()->sample(_latest_cms_msc_end_to_msc_start_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
506 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 void CMSAdaptiveSizePolicy::msc_collection_end(GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
510 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
512 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
513 gclog_or_tty->print(": msc_collection_end ");
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
517 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 double msc_pause_in_seconds = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
519 if ((_latest_cms_msc_end_to_msc_start_time_secs > 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
520 (msc_pause_in_seconds > 0.0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
521 avg_msc_pause()->sample(msc_pause_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
522 double mutator_time_in_seconds = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 if (_latest_cms_collection_end_to_collection_start_secs == 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // This assertion may fail because of time stamp gradularity.
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // Comment it out and investiage it at a later time. The large
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // time stamp granularity occurs on some older linux systems.
a61af66fc99e Initial load
duke
parents:
diff changeset
527 #ifndef CLOCK_GRANULARITY_TOO_LARGE
a61af66fc99e Initial load
duke
parents:
diff changeset
528 assert((_latest_cms_concurrent_marking_time_secs == 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
529 (_latest_cms_concurrent_precleaning_time_secs == 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
530 (_latest_cms_concurrent_sweeping_time_secs == 0.0),
a61af66fc99e Initial load
duke
parents:
diff changeset
531 "There should not be any concurrent time");
a61af66fc99e Initial load
duke
parents:
diff changeset
532 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // A concurrent collection did not start. Mutator time
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // between collections comes from the STW MSC timer.
a61af66fc99e Initial load
duke
parents:
diff changeset
535 mutator_time_in_seconds = _latest_cms_msc_end_to_msc_start_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // The concurrent collection did start so count the mutator
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // time to the start of the concurrent collection. In this
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // case the _latest_cms_msc_end_to_msc_start_time_secs measures
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // the time between the initial mark or remark and the
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // start of the MSC. That has no real meaning.
a61af66fc99e Initial load
duke
parents:
diff changeset
542 mutator_time_in_seconds = _latest_cms_collection_end_to_collection_start_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 double latest_cms_sum_concurrent_phases_time_secs =
a61af66fc99e Initial load
duke
parents:
diff changeset
546 concurrent_collection_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
547 double interval_in_seconds =
a61af66fc99e Initial load
duke
parents:
diff changeset
548 mutator_time_in_seconds +
a61af66fc99e Initial load
duke
parents:
diff changeset
549 _latest_cms_initial_mark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
550 _latest_cms_remark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
551 latest_cms_sum_concurrent_phases_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
552 msc_pause_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 gclog_or_tty->print_cr(" interval_in_seconds %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
556 " mutator_time_in_seconds %f \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
557 " _latest_cms_initial_mark_start_to_end_time_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
558 " _latest_cms_remark_start_to_end_time_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
559 " latest_cms_sum_concurrent_phases_time_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
560 " msc_pause_in_seconds %f\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
561 interval_in_seconds,
a61af66fc99e Initial load
duke
parents:
diff changeset
562 mutator_time_in_seconds,
a61af66fc99e Initial load
duke
parents:
diff changeset
563 _latest_cms_initial_mark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
564 _latest_cms_remark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
565 latest_cms_sum_concurrent_phases_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
566 msc_pause_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // The concurrent cost is wasted cost but it should be
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // included.
a61af66fc99e Initial load
duke
parents:
diff changeset
571 double concurrent_cost = concurrent_collection_cost(interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Initial mark and remark, also wasted.
a61af66fc99e Initial load
duke
parents:
diff changeset
574 double STW_time_in_seconds = _latest_cms_initial_mark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
575 _latest_cms_remark_start_to_end_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
576 double STW_collection_cost =
a61af66fc99e Initial load
duke
parents:
diff changeset
577 collection_cost(STW_time_in_seconds, interval_in_seconds) +
a61af66fc99e Initial load
duke
parents:
diff changeset
578 concurrent_cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 gclog_or_tty->print_cr(" msc_collection_end:\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
582 "_latest_cms_collection_end_to_collection_start_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
583 "_latest_cms_msc_end_to_msc_start_time_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
584 "_latest_cms_initial_mark_start_to_end_time_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
585 "_latest_cms_remark_start_to_end_time_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
586 "latest_cms_sum_concurrent_phases_time_secs %f\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
587 _latest_cms_collection_end_to_collection_start_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
588 _latest_cms_msc_end_to_msc_start_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
589 _latest_cms_initial_mark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
590 _latest_cms_remark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
591 latest_cms_sum_concurrent_phases_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
592
a61af66fc99e Initial load
duke
parents:
diff changeset
593 gclog_or_tty->print_cr(" msc_collection_end: \n"
a61af66fc99e Initial load
duke
parents:
diff changeset
594 "latest_cms_sum_concurrent_phases_time_secs %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
595 "STW_time_in_seconds %f\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
596 "msc_pause_in_seconds %f\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
597 latest_cms_sum_concurrent_phases_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
598 STW_time_in_seconds,
a61af66fc99e Initial load
duke
parents:
diff changeset
599 msc_pause_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 double cost = concurrent_cost + STW_collection_cost +
a61af66fc99e Initial load
duke
parents:
diff changeset
603 collection_cost(msc_pause_in_seconds, interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 _avg_msc_gc_cost->sample(cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // Average this ms cost into all the other types gc costs
a61af66fc99e Initial load
duke
parents:
diff changeset
608 avg_major_gc_cost()->sample(cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // Sample for performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
611 _avg_msc_interval->sample(interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
612 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 gclog_or_tty->print("cmsAdaptiveSizePolicy::msc_collection_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
614 "MSC gc cost: %f average: %f", cost,
a61af66fc99e Initial load
duke
parents:
diff changeset
615 _avg_msc_gc_cost->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 double msc_pause_in_ms = msc_pause_in_seconds * MILLIUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
618 gclog_or_tty->print_cr(" MSC pause: %f (ms) MSC period %f (ms)",
a61af66fc99e Initial load
duke
parents:
diff changeset
619 msc_pause_in_ms, (double) interval_in_seconds * MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 clear_internal_time_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // Can this call be put into the epilogue?
a61af66fc99e Initial load
duke
parents:
diff changeset
627 set_first_after_collection();
a61af66fc99e Initial load
duke
parents:
diff changeset
628
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // The concurrent phases keeps track of it's own mutator interval
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // with this timer. This allows the stop-the-world phase to
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // be included in the mutator time so that the stop-the-world time
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // is not double counted. Reset and start it.
a61af66fc99e Initial load
duke
parents:
diff changeset
633 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
634 _concurrent_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
635 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
638 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 void CMSAdaptiveSizePolicy::ms_collection_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
644 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 gclog_or_tty->print(": ms_collection_begin ");
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
648 _latest_cms_ms_end_to_ms_start = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
649 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
650 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::ms_collection_begin: "
a61af66fc99e Initial load
duke
parents:
diff changeset
651 "mutator time %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
652 _latest_cms_ms_end_to_ms_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
654 avg_ms_interval()->sample(_STW_timer.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
655 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
656 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 void CMSAdaptiveSizePolicy::ms_collection_end(GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
661 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
662 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
663 gclog_or_tty->print(": ms_collection_end ");
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
666 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
667 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // The MS collection is a foreground collection that does all
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // the parts of a mostly concurrent collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
670 //
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // For this collection include the cost of the
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // initial mark
a61af66fc99e Initial load
duke
parents:
diff changeset
673 // remark
a61af66fc99e Initial load
duke
parents:
diff changeset
674 // all concurrent time (scaled down by the
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // concurrent_processor_fraction). Some
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // may be zero if the baton was passed before
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // it was reached.
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // concurrent marking
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // sweeping
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // resetting
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // STW after baton was passed (STW_in_foreground_in_seconds)
a61af66fc99e Initial load
duke
parents:
diff changeset
682 double STW_in_foreground_in_seconds = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 double latest_cms_sum_concurrent_phases_time_secs =
a61af66fc99e Initial load
duke
parents:
diff changeset
685 concurrent_collection_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
686 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 gclog_or_tty->print_cr("\nCMSAdaptiveSizePolicy::ms_collecton_end "
a61af66fc99e Initial load
duke
parents:
diff changeset
688 "STW_in_foreground_in_seconds %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
689 "_latest_cms_initial_mark_start_to_end_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
690 "_latest_cms_remark_start_to_end_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
691 "latest_cms_sum_concurrent_phases_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
692 "_latest_cms_ms_marking_start_to_end_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
693 "_latest_cms_ms_end_to_ms_start %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
694 STW_in_foreground_in_seconds,
a61af66fc99e Initial load
duke
parents:
diff changeset
695 _latest_cms_initial_mark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
696 _latest_cms_remark_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
697 latest_cms_sum_concurrent_phases_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
698 _latest_cms_ms_marking_start_to_end_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
699 _latest_cms_ms_end_to_ms_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
701
a61af66fc99e Initial load
duke
parents:
diff changeset
702 double STW_marking_in_seconds = _latest_cms_initial_mark_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
703 _latest_cms_remark_start_to_end_time_secs;
a61af66fc99e Initial load
duke
parents:
diff changeset
704 #ifndef CLOCK_GRANULARITY_TOO_LARGE
a61af66fc99e Initial load
duke
parents:
diff changeset
705 assert(_latest_cms_ms_marking_start_to_end_time_secs == 0.0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
706 latest_cms_sum_concurrent_phases_time_secs == 0.0,
a61af66fc99e Initial load
duke
parents:
diff changeset
707 "marking done twice?");
a61af66fc99e Initial load
duke
parents:
diff changeset
708 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
709 double ms_time_in_seconds = STW_marking_in_seconds +
a61af66fc99e Initial load
duke
parents:
diff changeset
710 STW_in_foreground_in_seconds +
a61af66fc99e Initial load
duke
parents:
diff changeset
711 _latest_cms_ms_marking_start_to_end_time_secs +
a61af66fc99e Initial load
duke
parents:
diff changeset
712 scaled_concurrent_collection_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
713 avg_ms_pause()->sample(ms_time_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // Use the STW costs from the initial mark and remark plus
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // the cost of the concurrent phase to calculate a
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // collection cost.
a61af66fc99e Initial load
duke
parents:
diff changeset
717 double cost = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
718 if ((_latest_cms_ms_end_to_ms_start > 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
719 (ms_time_in_seconds > 0.0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
720 double interval_in_seconds =
a61af66fc99e Initial load
duke
parents:
diff changeset
721 _latest_cms_ms_end_to_ms_start + ms_time_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
724 gclog_or_tty->print_cr("\n ms_time_in_seconds %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
725 "latest_cms_sum_concurrent_phases_time_secs %f "
a61af66fc99e Initial load
duke
parents:
diff changeset
726 "interval_in_seconds %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
727 ms_time_in_seconds,
a61af66fc99e Initial load
duke
parents:
diff changeset
728 latest_cms_sum_concurrent_phases_time_secs,
a61af66fc99e Initial load
duke
parents:
diff changeset
729 interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 cost = collection_cost(ms_time_in_seconds, interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 _avg_ms_gc_cost->sample(cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // Average this ms cost into all the other types gc costs
a61af66fc99e Initial load
duke
parents:
diff changeset
736 avg_major_gc_cost()->sample(cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // Sample for performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
739 _avg_ms_interval->sample(interval_in_seconds);
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 gclog_or_tty->print("cmsAdaptiveSizePolicy::ms_collection_end: "
a61af66fc99e Initial load
duke
parents:
diff changeset
743 "MS gc cost: %f average: %f", cost, _avg_ms_gc_cost->average());
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 double ms_time_in_ms = ms_time_in_seconds * MILLIUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 gclog_or_tty->print_cr(" MS pause: %f (ms) MS period %f (ms)",
a61af66fc99e Initial load
duke
parents:
diff changeset
747 ms_time_in_ms,
a61af66fc99e Initial load
duke
parents:
diff changeset
748 _latest_cms_ms_end_to_ms_start * MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // Consider putting this code (here to end) into a
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // method for convenience.
a61af66fc99e Initial load
duke
parents:
diff changeset
754 clear_internal_time_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756 set_first_after_collection();
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // The concurrent phases keeps track of it's own mutator interval
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // with this timer. This allows the stop-the-world phase to
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // be included in the mutator time so that the stop-the-world time
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // is not double counted. Reset and start it.
a61af66fc99e Initial load
duke
parents:
diff changeset
762 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
763 _concurrent_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
764 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
765
a61af66fc99e Initial load
duke
parents:
diff changeset
766 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
767 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769
a61af66fc99e Initial load
duke
parents:
diff changeset
770 void CMSAdaptiveSizePolicy::clear_internal_time_intervals() {
a61af66fc99e Initial load
duke
parents:
diff changeset
771 _latest_cms_reset_end_to_initial_mark_start_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 _latest_cms_initial_mark_end_to_remark_start_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
773 _latest_cms_collection_end_to_collection_start_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
774 _latest_cms_concurrent_marking_time_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
775 _latest_cms_concurrent_precleaning_time_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
776 _latest_cms_concurrent_sweeping_time_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
777 _latest_cms_msc_end_to_msc_start_time_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
778 _latest_cms_ms_end_to_ms_start = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
779 _latest_cms_remark_start_to_end_time_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 _latest_cms_initial_mark_start_to_end_time_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 _latest_cms_ms_marking_start_to_end_time_secs = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783
a61af66fc99e Initial load
duke
parents:
diff changeset
784 void CMSAdaptiveSizePolicy::clear_generation_free_space_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 AdaptiveSizePolicy::clear_generation_free_space_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 set_change_young_gen_for_maj_pauses(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 void CMSAdaptiveSizePolicy::concurrent_phases_resume() {
a61af66fc99e Initial load
duke
parents:
diff changeset
791 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
792 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
793 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::concurrent_phases_resume()");
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798 double CMSAdaptiveSizePolicy::time_since_major_gc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 _concurrent_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
800 double time_since_cms_gc = _concurrent_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
801 _concurrent_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
802 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
803 double time_since_STW_gc = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
804 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 return MIN2(time_since_cms_gc, time_since_STW_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 double CMSAdaptiveSizePolicy::major_gc_interval_average_for_decay() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 double cms_interval = _avg_concurrent_interval->average();
a61af66fc99e Initial load
duke
parents:
diff changeset
811 double msc_interval = _avg_msc_interval->average();
a61af66fc99e Initial load
duke
parents:
diff changeset
812 double ms_interval = _avg_ms_interval->average();
a61af66fc99e Initial load
duke
parents:
diff changeset
813
a61af66fc99e Initial load
duke
parents:
diff changeset
814 return MAX3(cms_interval, msc_interval, ms_interval);
a61af66fc99e Initial load
duke
parents:
diff changeset
815 }
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817 double CMSAdaptiveSizePolicy::cms_gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 return avg_major_gc_cost()->average();
a61af66fc99e Initial load
duke
parents:
diff changeset
819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 void CMSAdaptiveSizePolicy::ms_collection_marking_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
822 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // Start accumumlating time for the marking in the STW timer.
a61af66fc99e Initial load
duke
parents:
diff changeset
824 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
825 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828 void CMSAdaptiveSizePolicy::ms_collection_marking_end(
a61af66fc99e Initial load
duke
parents:
diff changeset
829 GCCause::Cause gc_cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
830 _STW_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
831 if (gc_cause != GCCause::_java_lang_system_gc ||
a61af66fc99e Initial load
duke
parents:
diff changeset
832 UseAdaptiveSizePolicyWithSystemGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
833 _latest_cms_ms_marking_start_to_end_time_secs = _STW_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
834 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
835 gclog_or_tty->print_cr("CMSAdaptiveSizePolicy::"
a61af66fc99e Initial load
duke
parents:
diff changeset
836 "msc_collection_marking_end: mutator time %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
837 _latest_cms_ms_marking_start_to_end_time_secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840 _STW_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
841 _STW_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 double CMSAdaptiveSizePolicy::gc_cost() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
845 double cms_gen_cost = cms_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
846 double result = MIN2(1.0, minor_gc_cost() + cms_gen_cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
847 assert(result >= 0.0, "Both minor and major costs are non-negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
848 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // Cost of collection (unit-less)
a61af66fc99e Initial load
duke
parents:
diff changeset
852 double CMSAdaptiveSizePolicy::collection_cost(double pause_in_seconds,
a61af66fc99e Initial load
duke
parents:
diff changeset
853 double interval_in_seconds) {
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // Cost of collection (unit-less)
a61af66fc99e Initial load
duke
parents:
diff changeset
855 double cost = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
856 if ((interval_in_seconds > 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
857 (pause_in_seconds > 0.0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
858 cost =
a61af66fc99e Initial load
duke
parents:
diff changeset
859 pause_in_seconds / interval_in_seconds;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 }
a61af66fc99e Initial load
duke
parents:
diff changeset
861 return cost;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 size_t CMSAdaptiveSizePolicy::adjust_eden_for_pause_time(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 size_t change = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
866 size_t desired_eden = cur_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 // reduce eden size
a61af66fc99e Initial load
duke
parents:
diff changeset
869 change = eden_decrement_aligned_down(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
870 desired_eden = cur_eden - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
874 "CMSAdaptiveSizePolicy::adjust_eden_for_pause_time "
a61af66fc99e Initial load
duke
parents:
diff changeset
875 "adjusting eden for pause time. "
a61af66fc99e Initial load
duke
parents:
diff changeset
876 " starting eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
877 " reduced eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
878 " eden delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
879 cur_eden, desired_eden, change);
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 return desired_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 size_t CMSAdaptiveSizePolicy::adjust_eden_for_throughput(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 size_t desired_eden = cur_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 set_change_young_gen_for_throughput(increase_young_gen_for_througput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 size_t change = eden_increment_aligned_up(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
892 size_t scaled_change = scale_by_gen_gc_cost(change, minor_gc_cost());
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 if (cur_eden + scaled_change > cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 desired_eden = cur_eden + scaled_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 _young_gen_change_for_minor_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
902 "CMSAdaptiveSizePolicy::adjust_eden_for_throughput "
a61af66fc99e Initial load
duke
parents:
diff changeset
903 "adjusting eden for throughput. "
a61af66fc99e Initial load
duke
parents:
diff changeset
904 " starting eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
905 " increased eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
906 " eden delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
907 cur_eden, desired_eden, scaled_change);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 return desired_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 size_t CMSAdaptiveSizePolicy::adjust_eden_for_footprint(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
914
a61af66fc99e Initial load
duke
parents:
diff changeset
915 set_decrease_for_footprint(decrease_young_gen_for_footprint_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 size_t change = eden_decrement(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
918 size_t desired_eden_size = cur_eden - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
921 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
922 "CMSAdaptiveSizePolicy::adjust_eden_for_footprint "
a61af66fc99e Initial load
duke
parents:
diff changeset
923 "adjusting eden for footprint. "
a61af66fc99e Initial load
duke
parents:
diff changeset
924 " starting eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
925 " reduced eden size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
926 " eden delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
927 cur_eden, desired_eden_size, change);
a61af66fc99e Initial load
duke
parents:
diff changeset
928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
929 return desired_eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
930 }
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // The eden and promo versions should be combined if possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
933 // They are the same except that the sizes of the decrement
a61af66fc99e Initial load
duke
parents:
diff changeset
934 // and increment are different for eden and promo.
a61af66fc99e Initial load
duke
parents:
diff changeset
935 size_t CMSAdaptiveSizePolicy::eden_decrement_aligned_down(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
936 size_t delta = eden_decrement(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
937 return align_size_down(delta, generation_alignment());
a61af66fc99e Initial load
duke
parents:
diff changeset
938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940 size_t CMSAdaptiveSizePolicy::eden_increment_aligned_up(size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
941 size_t delta = eden_increment(cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
942 return align_size_up(delta, generation_alignment());
a61af66fc99e Initial load
duke
parents:
diff changeset
943 }
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 size_t CMSAdaptiveSizePolicy::promo_decrement_aligned_down(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 size_t delta = promo_decrement(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
947 return align_size_down(delta, generation_alignment());
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 size_t CMSAdaptiveSizePolicy::promo_increment_aligned_up(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
951 size_t delta = promo_increment(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
952 return align_size_up(delta, generation_alignment());
a61af66fc99e Initial load
duke
parents:
diff changeset
953 }
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955
a61af66fc99e Initial load
duke
parents:
diff changeset
956 void CMSAdaptiveSizePolicy::compute_young_generation_free_space(size_t cur_eden,
a61af66fc99e Initial load
duke
parents:
diff changeset
957 size_t max_eden_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
958 {
a61af66fc99e Initial load
duke
parents:
diff changeset
959 size_t desired_eden_size = cur_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
960 size_t eden_limit = max_eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
961
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // Printout input
a61af66fc99e Initial load
duke
parents:
diff changeset
963 if (PrintGC && PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
964 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
965 "CMSAdaptiveSizePolicy::compute_young_generation_free_space: "
a61af66fc99e Initial load
duke
parents:
diff changeset
966 "cur_eden " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
967 cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // Used for diagnostics
a61af66fc99e Initial load
duke
parents:
diff changeset
971 clear_generation_free_space_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 if (_avg_minor_pause->padded_average() > gc_pause_goal_sec()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
974 if (minor_pause_young_estimator()->decrement_will_decrease()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // If the minor pause is too long, shrink the young gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
976 set_change_young_gen_for_min_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
977 decrease_young_gen_for_min_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
978 desired_eden_size = adjust_eden_for_pause_time(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
979 }
a61af66fc99e Initial load
duke
parents:
diff changeset
980 } else if ((avg_remark_pause()->padded_average() > gc_pause_goal_sec()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
981 (avg_initial_pause()->padded_average() > gc_pause_goal_sec())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 // The remark or initial pauses are not meeting the goal. Should
a61af66fc99e Initial load
duke
parents:
diff changeset
983 // the generation be shrunk?
a61af66fc99e Initial load
duke
parents:
diff changeset
984 if (get_and_clear_first_after_collection() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
985 ((avg_remark_pause()->padded_average() > gc_pause_goal_sec() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
986 remark_pause_young_estimator()->decrement_will_decrease()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
987 (avg_initial_pause()->padded_average() > gc_pause_goal_sec() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
988 initial_pause_young_estimator()->decrement_will_decrease()))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 set_change_young_gen_for_maj_pauses(
a61af66fc99e Initial load
duke
parents:
diff changeset
991 decrease_young_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // If the remark or initial pause is too long and this is the
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // first young gen collection after a cms collection, shrink
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // the young gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
996 desired_eden_size = adjust_eden_for_pause_time(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // If not the first young gen collection after a cms collection,
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // don't do anything. In this case an adjustment has already
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 // been made and the results of the adjustment has not yet been
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 // measured.
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 } else if ((minor_gc_cost() >= 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 (adjusted_mutator_cost() < _throughput_goal)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 desired_eden_size = adjust_eden_for_throughput(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 desired_eden_size = adjust_eden_for_footprint(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 if (PrintGC && PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 "CMSAdaptiveSizePolicy::compute_young_generation_free_space limits:"
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 " desired_eden_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 " old_eden_size: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 desired_eden_size, cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 set_eden_size(desired_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 size_t CMSAdaptiveSizePolicy::adjust_promo_for_pause_time(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 size_t change = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 size_t desired_promo = cur_promo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 // Move this test up to caller like the adjust_eden_for_pause_time()
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // call.
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 if ((AdaptiveSizePausePolicy == 0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 ((avg_remark_pause()->padded_average() > gc_pause_goal_sec()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 (avg_initial_pause()->padded_average() > gc_pause_goal_sec()))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 set_change_old_gen_for_maj_pauses(decrease_old_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 change = promo_decrement_aligned_down(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 desired_promo = cur_promo - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 } else if ((AdaptiveSizePausePolicy > 0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 (((avg_remark_pause()->padded_average() > gc_pause_goal_sec()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 remark_pause_old_estimator()->decrement_will_decrease()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 ((avg_initial_pause()->padded_average() > gc_pause_goal_sec()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 initial_pause_old_estimator()->decrement_will_decrease()))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 set_change_old_gen_for_maj_pauses(decrease_old_gen_for_maj_pauses_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 change = promo_decrement_aligned_down(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 desired_promo = cur_promo - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 if ((change != 0) &&PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 "CMSAdaptiveSizePolicy::adjust_promo_for_pause_time "
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 "adjusting promo for pause time. "
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 " starting promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 " reduced promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 " promo delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 cur_promo, desired_promo, change);
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 return desired_promo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1053
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // Try to share this with PS.
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 size_t CMSAdaptiveSizePolicy::scale_by_gen_gc_cost(size_t base_change,
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 double gen_gc_cost) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // Calculate the change to use for the tenured gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 size_t scaled_change = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // Can the increment to the generation be scaled?
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 if (gc_cost() >= 0.0 && gen_gc_cost >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 double scale_by_ratio = gen_gc_cost / gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 scaled_change =
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 (size_t) (scale_by_ratio * (double) base_change);
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 "Scaled tenured increment: " SIZE_FORMAT " by %f down to "
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 base_change, scale_by_ratio, scaled_change);
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 } else if (gen_gc_cost >= 0.0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // Scaling is not going to work. If the major gc time is the
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 // larger than the other GC costs, give it a full increment.
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 if (gen_gc_cost >= (gc_cost() - gen_gc_cost)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 scaled_change = base_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Don't expect to get here but it's ok if it does
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // in the product build since the delta will be 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // and nothing will change.
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 assert(false, "Unexpected value for gc costs");
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 return scaled_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 size_t CMSAdaptiveSizePolicy::adjust_promo_for_throughput(size_t cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1088
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 size_t desired_promo = cur_promo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1090
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 set_change_old_gen_for_throughput(increase_old_gen_for_throughput_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 size_t change = promo_increment_aligned_up(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 size_t scaled_change = scale_by_gen_gc_cost(change, major_gc_cost());
a61af66fc99e Initial load
duke
parents:
diff changeset
1095
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 if (cur_promo + scaled_change > cur_promo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 desired_promo = cur_promo + scaled_change;
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 _old_gen_change_for_major_throughput++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1101
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 "CMSAdaptiveSizePolicy::adjust_promo_for_throughput "
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 "adjusting promo for throughput. "
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 " starting promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 " increased promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 " promo delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 cur_promo, desired_promo, scaled_change);
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 return desired_promo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 size_t CMSAdaptiveSizePolicy::adjust_promo_for_footprint(size_t cur_promo,
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 set_decrease_for_footprint(decrease_young_gen_for_footprint_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 size_t change = promo_decrement(cur_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 size_t desired_promo_size = cur_promo - change;
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 if (PrintAdaptiveSizePolicy && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 "CMSAdaptiveSizePolicy::adjust_promo_for_footprint "
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 "adjusting promo for footprint. "
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 " starting promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 " reduced promo size " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 " promo delta " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 cur_promo, desired_promo_size, change);
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 return desired_promo_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1134
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 void CMSAdaptiveSizePolicy::compute_tenured_generation_free_space(
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 size_t cur_tenured_free,
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 size_t max_tenured_available,
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 size_t cur_eden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // This can be bad if the desired value grows/shrinks without
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 // any connection to the read free space
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 size_t desired_promo_size = promo_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 size_t tenured_limit = max_tenured_available;
a61af66fc99e Initial load
duke
parents:
diff changeset
1143
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // Printout input
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 if (PrintGC && PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 "CMSAdaptiveSizePolicy::compute_tenured_generation_free_space: "
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 "cur_tenured_free " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 " max_tenured_available " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 cur_tenured_free, max_tenured_available);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // Used for diagnostics
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 clear_generation_free_space_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 set_decide_at_full_gc(decide_at_full_gc_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 if (avg_remark_pause()->padded_average() > gc_pause_goal_sec() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 avg_initial_pause()->padded_average() > gc_pause_goal_sec()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 desired_promo_size = adjust_promo_for_pause_time(cur_tenured_free);
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 } else if (avg_minor_pause()->padded_average() > gc_pause_goal_sec()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // Nothing to do since the minor collections are too large and
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 // this method only deals with the cms generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 } else if ((cms_gc_cost() >= 0.0) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 (adjusted_mutator_cost() < _throughput_goal)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 desired_promo_size = adjust_promo_for_throughput(cur_tenured_free);
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 desired_promo_size = adjust_promo_for_footprint(cur_tenured_free,
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 cur_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 if (PrintGC && PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 gclog_or_tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 "CMSAdaptiveSizePolicy::compute_tenured_generation_free_space limits:"
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 " desired_promo_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 " old_promo_size: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 desired_promo_size, cur_tenured_free);
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1178
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 set_promo_size(desired_promo_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 int CMSAdaptiveSizePolicy::compute_survivor_space_size_and_threshold(
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 bool is_survivor_overflow,
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 int tenuring_threshold,
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 size_t survivor_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 assert(survivor_limit >= generation_alignment(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 "survivor_limit too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 assert((size_t)align_size_down(survivor_limit, generation_alignment())
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 == survivor_limit, "survivor_limit not aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
1190
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // Change UsePSAdaptiveSurvivorSizePolicy -> UseAdaptiveSurvivorSizePolicy?
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 if (!UsePSAdaptiveSurvivorSizePolicy ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 !young_gen_policy_is_ready()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 return tenuring_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 // We'll decide whether to increase or decrease the tenuring
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 // threshold based partly on the newly computed survivor size
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // (if we hit the maximum limit allowed, we'll always choose to
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 // decrement the threshold).
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 bool incr_tenuring_threshold = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 bool decr_tenuring_threshold = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 set_decrement_tenuring_threshold_for_gc_cost(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 set_increment_tenuring_threshold_for_gc_cost(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 set_decrement_tenuring_threshold_for_survivor_limit(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 if (!is_survivor_overflow) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 // Keep running averages on how much survived
a61af66fc99e Initial load
duke
parents:
diff changeset
1210
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 // We use the tenuring threshold to equalize the cost of major
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // and minor collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // ThresholdTolerance is used to indicate how sensitive the
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // tenuring threshold is to differences in cost betweent the
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 // collection types.
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // Get the times of interest. This involves a little work, so
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // we cache the values here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 const double major_cost = major_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 const double minor_cost = minor_gc_cost();
a61af66fc99e Initial load
duke
parents:
diff changeset
1221
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 if (minor_cost > major_cost * _threshold_tolerance_percent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 // Minor times are getting too long; lower the threshold so
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // less survives and more is promoted.
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 set_decrement_tenuring_threshold_for_gc_cost(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 } else if (major_cost > minor_cost * _threshold_tolerance_percent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // Major times are too long, so we want less promotion.
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 incr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 set_increment_tenuring_threshold_for_gc_cost(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1232
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // Survivor space overflow occurred, so promoted and survived are
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // not accurate. We'll make our best guess by combining survived
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // and promoted and count them as survivors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // We'll lower the tenuring threshold to see if we can correct
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 // things. Also, set the survivor size conservatively. We're
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // trying to avoid many overflows from occurring if defnew size
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 // is just too small.
a61af66fc99e Initial load
duke
parents:
diff changeset
1242
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1245
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // The padded average also maintains a deviation from the average;
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // we use this to see how good of an estimate we have of what survived.
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 // We're trying to pad the survivor size as little as possible without
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // overflowing the survivor spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 size_t target_size = align_size_up((size_t)_avg_survived->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 generation_alignment());
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 target_size = MAX2(target_size, generation_alignment());
a61af66fc99e Initial load
duke
parents:
diff changeset
1253
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 if (target_size > survivor_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 // Target size is bigger than we can handle. Let's also reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 // the tenuring threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 target_size = survivor_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 decr_tenuring_threshold = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 set_decrement_tenuring_threshold_for_survivor_limit(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1261
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 // Finally, increment or decrement the tenuring threshold, as decided above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 // We test for decrementing first, as we might have hit the target size
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 // limit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 if (decr_tenuring_threshold && !(AlwaysTenure || NeverTenure)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 if (tenuring_threshold > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 tenuring_threshold--;
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 } else if (incr_tenuring_threshold && !(AlwaysTenure || NeverTenure)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 if (tenuring_threshold < MaxTenuringThreshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 tenuring_threshold++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // We keep a running average of the amount promoted which is used
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 // to decide when we should collect the old generation (when
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 // the amount of old gen free space is less than what we expect to
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 // promote).
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 // A little more detail if Verbose is on
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 gclog_or_tty->print( " avg_survived: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 " avg_deviation: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 _avg_survived->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 _avg_survived->deviation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1289
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 gclog_or_tty->print( " avg_survived_padded_avg: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 _avg_survived->padded_average());
a61af66fc99e Initial load
duke
parents:
diff changeset
1292
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 gclog_or_tty->print( " avg_promoted_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 " avg_promoted_dev: %f",
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 gch->gc_stats(1)->avg_promoted()->average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 gch->gc_stats(1)->avg_promoted()->deviation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1299
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 gclog_or_tty->print( " avg_promoted_padded_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 " avg_pretenured_padded_avg: %f"
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 " tenuring_thresh: %d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 " target_size: " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 " survivor_limit: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 gch->gc_stats(1)->avg_promoted()->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 _avg_pretenured->padded_average(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 tenuring_threshold, target_size, survivor_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 gclog_or_tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1310
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 set_survivor_size(target_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1312
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 return tenuring_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 bool CMSAdaptiveSizePolicy::get_and_clear_first_after_collection() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 bool result = _first_after_collection;
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 _first_after_collection = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1321
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 bool CMSAdaptiveSizePolicy::print_adaptive_size_policy_on(
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1324
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 if (!UseAdaptiveSizePolicy) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 Generation* gen0 = gch->get_gen(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 DefNewGeneration* def_new = gen0->as_DefNewGeneration();
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 return
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 AdaptiveSizePolicy::print_adaptive_size_policy_on(
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 st,
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 def_new->tenuring_threshold());
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 }