Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/shared/allocationStats.hpp @ 10374:87c64c0438fb
6976350: G1: deal with fragmentation while copying objects during GC
Summary: Create G1ParGCAllocBufferContainer to contain two buffers instead of previously using one buffer, in order to hold the first priority buffer longer. Thus, when some large objects hits the value of free space left in the first priority buffer it has an alternative to fit in the second priority buffer while the first priority buffer is given more chances to try allocating smaller objects. Overall, it will improve heap space efficiency.
Reviewed-by: johnc, jmasa, brutisso
Contributed-by: tamao <tao.mao@oracle.com>
author | tamao |
---|---|
date | Mon, 03 Jun 2013 14:37:13 -0700 |
parents | db9981fd3124 |
children | de88570fabfc |
rev | line source |
---|---|
0 | 1 /* |
6842
b9a9ed0f8eeb
7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents:
6028
diff
changeset
|
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1145
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1145
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1145
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_ALLOCATIONSTATS_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_SHARED_ALLOCATIONSTATS_HPP | |
27 | |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
6842
diff
changeset
|
28 #include "utilities/macros.hpp" |
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
6842
diff
changeset
|
29 #if INCLUDE_ALL_GCS |
1972 | 30 #include "gc_implementation/shared/gcUtil.hpp" |
31 #include "memory/allocation.hpp" | |
32 #include "utilities/globalDefinitions.hpp" | |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
6842
diff
changeset
|
33 #endif // INCLUDE_ALL_GCS |
1972 | 34 |
0 | 35 class AllocationStats VALUE_OBJ_CLASS_SPEC { |
36 // A duration threshold (in ms) used to filter | |
37 // possibly unreliable samples. | |
38 static float _threshold; | |
39 | |
40 // We measure the demand between the end of the previous sweep and | |
41 // beginning of this sweep: | |
42 // Count(end_last_sweep) - Count(start_this_sweep) | |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
43 // + split_births(between) - split_deaths(between) |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
44 // The above number divided by the time since the end of the |
0 | 45 // previous sweep gives us a time rate of demand for blocks |
46 // of this size. We compute a padded average of this rate as | |
47 // our current estimate for the time rate of demand for blocks | |
48 // of this size. Similarly, we keep a padded average for the time | |
49 // between sweeps. Our current estimate for demand for blocks of | |
50 // this size is then simply computed as the product of these two | |
51 // estimates. | |
52 AdaptivePaddedAverage _demand_rate_estimate; | |
53 | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
54 ssize_t _desired; // Demand stimate computed as described above |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
55 ssize_t _coal_desired; // desired +/- small-percent for tuning coalescing |
0 | 56 |
57 ssize_t _surplus; // count - (desired +/- small-percent), | |
58 // used to tune splitting in best fit | |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
59 ssize_t _bfr_surp; // surplus at start of current sweep |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
60 ssize_t _prev_sweep; // count from end of previous sweep |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
61 ssize_t _before_sweep; // count from before current sweep |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
62 ssize_t _coal_births; // additional chunks from coalescing |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
63 ssize_t _coal_deaths; // loss from coalescing |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
64 ssize_t _split_births; // additional chunks from splitting |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
65 ssize_t _split_deaths; // loss from splitting |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
66 size_t _returned_bytes; // number of bytes returned to list. |
0 | 67 public: |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
68 void initialize(bool split_birth = false) { |
0 | 69 AdaptivePaddedAverage* dummy = |
70 new (&_demand_rate_estimate) AdaptivePaddedAverage(CMS_FLSWeight, | |
71 CMS_FLSPadding); | |
72 _desired = 0; | |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
73 _coal_desired = 0; |
0 | 74 _surplus = 0; |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
75 _bfr_surp = 0; |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
76 _prev_sweep = 0; |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
77 _before_sweep = 0; |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
78 _coal_births = 0; |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
79 _coal_deaths = 0; |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
80 _split_births = (split_birth ? 1 : 0); |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
81 _split_deaths = 0; |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
82 _returned_bytes = 0; |
0 | 83 } |
84 | |
85 AllocationStats() { | |
86 initialize(); | |
87 } | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
88 |
0 | 89 // The rate estimate is in blocks per second. |
90 void compute_desired(size_t count, | |
91 float inter_sweep_current, | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
92 float inter_sweep_estimate, |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
93 float intra_sweep_estimate) { |
0 | 94 // If the latest inter-sweep time is below our granularity |
95 // of measurement, we may call in here with | |
96 // inter_sweep_current == 0. However, even for suitably small | |
97 // but non-zero inter-sweep durations, we may not trust the accuracy | |
98 // of accumulated data, since it has not been "integrated" | |
99 // (read "low-pass-filtered") long enough, and would be | |
100 // vulnerable to noisy glitches. In such cases, we | |
101 // ignore the current sample and use currently available | |
102 // historical estimates. | |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
103 assert(prev_sweep() + split_births() + coal_births() // "Total Production Stock" |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
104 >= split_deaths() + coal_deaths() + (ssize_t)count, // "Current stock + depletion" |
3775
f75137faa7fe
6916968: CMS: freeList.cpp:304 assert(_allocation_stats.prevSweep() + ..., "Conservation Principle")
ysr
parents:
3256
diff
changeset
|
105 "Conservation Principle"); |
0 | 106 if (inter_sweep_current > _threshold) { |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
107 ssize_t demand = prev_sweep() - (ssize_t)count + split_births() + coal_births() |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
108 - split_deaths() - coal_deaths(); |
3775
f75137faa7fe
6916968: CMS: freeList.cpp:304 assert(_allocation_stats.prevSweep() + ..., "Conservation Principle")
ysr
parents:
3256
diff
changeset
|
109 assert(demand >= 0, |
f75137faa7fe
6916968: CMS: freeList.cpp:304 assert(_allocation_stats.prevSweep() + ..., "Conservation Principle")
ysr
parents:
3256
diff
changeset
|
110 err_msg("Demand (" SSIZE_FORMAT ") should be non-negative for " |
f75137faa7fe
6916968: CMS: freeList.cpp:304 assert(_allocation_stats.prevSweep() + ..., "Conservation Principle")
ysr
parents:
3256
diff
changeset
|
111 PTR_FORMAT " (size=" SIZE_FORMAT ")", |
f75137faa7fe
6916968: CMS: freeList.cpp:304 assert(_allocation_stats.prevSweep() + ..., "Conservation Principle")
ysr
parents:
3256
diff
changeset
|
112 demand, this, count)); |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
113 // Defensive: adjust for imprecision in event counting |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
114 if (demand < 0) { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
115 demand = 0; |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
116 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
117 float old_rate = _demand_rate_estimate.padded_average(); |
0 | 118 float rate = ((float)demand)/inter_sweep_current; |
119 _demand_rate_estimate.sample(rate); | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
120 float new_rate = _demand_rate_estimate.padded_average(); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
121 ssize_t old_desired = _desired; |
2186
e49cfa28f585
6999988: CMS: Increased fragmentation leading to promotion failure after CR#6631166 got implemented
ysr
parents:
1972
diff
changeset
|
122 float delta_ise = (CMSExtrapolateSweep ? intra_sweep_estimate : 0.0); |
e49cfa28f585
6999988: CMS: Increased fragmentation leading to promotion failure after CR#6631166 got implemented
ysr
parents:
1972
diff
changeset
|
123 _desired = (ssize_t)(new_rate * (inter_sweep_estimate + delta_ise)); |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
124 if (PrintFLSStatistics > 1) { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
125 gclog_or_tty->print_cr("demand: %d, old_rate: %f, current_rate: %f, new_rate: %f, old_desired: %d, new_desired: %d", |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
126 demand, old_rate, rate, new_rate, old_desired, _desired); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
196
diff
changeset
|
127 } |
0 | 128 } |
129 } | |
130 | |
131 ssize_t desired() const { return _desired; } | |
12
6432c3bb6240
6668743: CMS: Consolidate block statistics reporting code
ysr
parents:
0
diff
changeset
|
132 void set_desired(ssize_t v) { _desired = v; } |
6432c3bb6240
6668743: CMS: Consolidate block statistics reporting code
ysr
parents:
0
diff
changeset
|
133 |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
134 ssize_t coal_desired() const { return _coal_desired; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
135 void set_coal_desired(ssize_t v) { _coal_desired = v; } |
0 | 136 |
137 ssize_t surplus() const { return _surplus; } | |
138 void set_surplus(ssize_t v) { _surplus = v; } | |
139 void increment_surplus() { _surplus++; } | |
140 void decrement_surplus() { _surplus--; } | |
141 | |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
142 ssize_t bfr_surp() const { return _bfr_surp; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
143 void set_bfr_surp(ssize_t v) { _bfr_surp = v; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
144 ssize_t prev_sweep() const { return _prev_sweep; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
145 void set_prev_sweep(ssize_t v) { _prev_sweep = v; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
146 ssize_t before_sweep() const { return _before_sweep; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
147 void set_before_sweep(ssize_t v) { _before_sweep = v; } |
0 | 148 |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
149 ssize_t coal_births() const { return _coal_births; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
150 void set_coal_births(ssize_t v) { _coal_births = v; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
151 void increment_coal_births() { _coal_births++; } |
0 | 152 |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
153 ssize_t coal_deaths() const { return _coal_deaths; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
154 void set_coal_deaths(ssize_t v) { _coal_deaths = v; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
155 void increment_coal_deaths() { _coal_deaths++; } |
0 | 156 |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
157 ssize_t split_births() const { return _split_births; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
158 void set_split_births(ssize_t v) { _split_births = v; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
159 void increment_split_births() { _split_births++; } |
0 | 160 |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
161 ssize_t split_deaths() const { return _split_deaths; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
162 void set_split_deaths(ssize_t v) { _split_deaths = v; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
163 void increment_split_deaths() { _split_deaths++; } |
0 | 164 |
165 NOT_PRODUCT( | |
6028
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
166 size_t returned_bytes() const { return _returned_bytes; } |
f69a5d43dc19
7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents:
3775
diff
changeset
|
167 void set_returned_bytes(size_t v) { _returned_bytes = v; } |
0 | 168 ) |
169 }; | |
1972 | 170 |
171 #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_ALLOCATIONSTATS_HPP |