Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/shared/gcUtil.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 | c18cbe5936b8 |
rev | line source |
---|---|
0 | 1 /* |
2 * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
22 * | |
23 */ | |
24 | |
25 # include "incls/_precompiled.incl" | |
26 # include "incls/_gcUtil.cpp.incl" | |
27 | |
28 // Catch-all file for utility classes | |
29 | |
30 float AdaptiveWeightedAverage::compute_adaptive_average(float new_sample, | |
31 float average) { | |
32 // We smooth the samples by not using weight() directly until we've | |
33 // had enough data to make it meaningful. We'd like the first weight | |
34 // used to be 1, the second to be 1/2, etc until we have 100/weight | |
35 // samples. | |
36 unsigned count_weight = 100/count(); | |
37 unsigned adaptive_weight = (MAX2(weight(), count_weight)); | |
38 | |
39 float new_avg = exp_avg(average, new_sample, adaptive_weight); | |
40 | |
41 return new_avg; | |
42 } | |
43 | |
44 void AdaptiveWeightedAverage::sample(float new_sample) { | |
45 increment_count(); | |
46 assert(count() != 0, | |
47 "Wraparound -- history would be incorrectly discarded"); | |
48 | |
49 // Compute the new weighted average | |
50 float new_avg = compute_adaptive_average(new_sample, average()); | |
51 set_average(new_avg); | |
52 _last_sample = new_sample; | |
53 } | |
54 | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
55 void AdaptiveWeightedAverage::print() const { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
56 print_on(tty); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
57 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
58 |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
59 void AdaptiveWeightedAverage::print_on(outputStream* st) const { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
60 guarantee(false, "NYI"); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
61 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
62 |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
63 void AdaptivePaddedAverage::print() const { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
64 print_on(tty); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
65 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
66 |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
67 void AdaptivePaddedAverage::print_on(outputStream* st) const { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
68 guarantee(false, "NYI"); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
69 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
70 |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
71 void AdaptivePaddedNoZeroDevAverage::print() const { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
72 print_on(tty); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
73 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
74 |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
75 void AdaptivePaddedNoZeroDevAverage::print_on(outputStream* st) const { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
76 guarantee(false, "NYI"); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
77 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
78 |
0 | 79 void AdaptivePaddedAverage::sample(float new_sample) { |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
80 // Compute new adaptive weighted average based on new sample. |
0 | 81 AdaptiveWeightedAverage::sample(new_sample); |
82 | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
0
diff
changeset
|
83 // Now update the deviation and the padded average. |
0 | 84 float new_avg = average(); |
85 float new_dev = compute_adaptive_average(fabsd(new_sample - new_avg), | |
86 deviation()); | |
87 set_deviation(new_dev); | |
88 set_padded_average(new_avg + padding() * new_dev); | |
89 _last_sample = new_sample; | |
90 } | |
91 | |
92 void AdaptivePaddedNoZeroDevAverage::sample(float new_sample) { | |
93 // Compute our parent classes sample information | |
94 AdaptiveWeightedAverage::sample(new_sample); | |
95 | |
96 float new_avg = average(); | |
97 if (new_sample != 0) { | |
98 // We only create a new deviation if the sample is non-zero | |
99 float new_dev = compute_adaptive_average(fabsd(new_sample - new_avg), | |
100 deviation()); | |
101 | |
102 set_deviation(new_dev); | |
103 } | |
104 set_padded_average(new_avg + padding() * deviation()); | |
105 _last_sample = new_sample; | |
106 } | |
107 | |
108 LinearLeastSquareFit::LinearLeastSquareFit(unsigned weight) : | |
109 _sum_x(0), _sum_y(0), _sum_xy(0), | |
110 _mean_x(weight), _mean_y(weight) {} | |
111 | |
112 void LinearLeastSquareFit::update(double x, double y) { | |
113 _sum_x = _sum_x + x; | |
114 _sum_x_squared = _sum_x_squared + x * x; | |
115 _sum_y = _sum_y + y; | |
116 _sum_xy = _sum_xy + x * y; | |
117 _mean_x.sample(x); | |
118 _mean_y.sample(y); | |
119 assert(_mean_x.count() == _mean_y.count(), "Incorrect count"); | |
120 if ( _mean_x.count() > 1 ) { | |
121 double slope_denominator; | |
122 slope_denominator = (_mean_x.count() * _sum_x_squared - _sum_x * _sum_x); | |
123 // Some tolerance should be injected here. A denominator that is | |
124 // nearly 0 should be avoided. | |
125 | |
126 if (slope_denominator != 0.0) { | |
127 double slope_numerator; | |
128 slope_numerator = (_mean_x.count() * _sum_xy - _sum_x * _sum_y); | |
129 _slope = slope_numerator / slope_denominator; | |
130 | |
131 // The _mean_y and _mean_x are decaying averages and can | |
132 // be used to discount earlier data. If they are used, | |
133 // first consider whether all the quantities should be | |
134 // kept as decaying averages. | |
135 // _intercept = _mean_y.average() - _slope * _mean_x.average(); | |
136 _intercept = (_sum_y - _slope * _sum_x) / ((double) _mean_x.count()); | |
137 } | |
138 } | |
139 } | |
140 | |
141 double LinearLeastSquareFit::y(double x) { | |
142 double new_y; | |
143 | |
144 if ( _mean_x.count() > 1 ) { | |
145 new_y = (_intercept + _slope * x); | |
146 return new_y; | |
147 } else { | |
148 return _mean_y.average(); | |
149 } | |
150 } | |
151 | |
152 // Both decrement_will_decrease() and increment_will_decrease() return | |
153 // true for a slope of 0. That is because a change is necessary before | |
154 // a slope can be calculated and a 0 slope will, in general, indicate | |
155 // that no calculation of the slope has yet been done. Returning true | |
156 // for a slope equal to 0 reflects the intuitive expectation of the | |
157 // dependence on the slope. Don't use the complement of these functions | |
158 // since that untuitive expectation is not built into the complement. | |
159 bool LinearLeastSquareFit::decrement_will_decrease() { | |
160 return (_slope >= 0.00); | |
161 } | |
162 | |
163 bool LinearLeastSquareFit::increment_will_decrease() { | |
164 return (_slope <= 0.00); | |
165 } |