annotate src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp @ 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 d1605aabd0a1
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 152
diff changeset
2 * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // A class for maintaining a free list of FreeChunk's. The FreeList
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // maintains a the structure of the list (head, tail, etc.) plus
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // statistics for allocations from the list. The links between items
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // are not part of FreeList. The statistics are
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // used to make decisions about coalescing FreeChunk's when they
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // are swept during collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
33 //
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // See the corresponding .cpp file for a description of the specifics
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // for that implementation.
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class Mutex;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
38 class TreeList;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class FreeList VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 friend class CompactibleFreeListSpace;
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 12
diff changeset
42 friend class VMStructs;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
43 friend class PrintTreeCensusClosure;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
44
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
45 protected:
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
46 TreeList* _parent;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
47 TreeList* _left;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
48 TreeList* _right;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
49
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
50 private:
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
51 FreeChunk* _head; // Head of list of free chunks
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52 FreeChunk* _tail; // Tail of list of free chunks
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
53 size_t _size; // Size in Heap words of each chunk
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 ssize_t _count; // Number of entries in list
a61af66fc99e Initial load
duke
parents:
diff changeset
55 size_t _hint; // next larger size list with a positive surplus
a61af66fc99e Initial load
duke
parents:
diff changeset
56
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
57 AllocationStats _allocation_stats; // allocation-related statistics
0
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
60 Mutex* _protecting_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Asserts false if the protecting lock (if any) is not held.
a61af66fc99e Initial load
duke
parents:
diff changeset
64 void assert_proper_lock_protection_work() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void assert_proper_lock_protection() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
67 if (_protecting_lock != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
68 assert_proper_lock_protection_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
69 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Initialize the allocation statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
73 protected:
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
74 void init_statistics(bool split_birth = false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75 void set_count(ssize_t v) { _count = v;}
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
76 void increment_count() {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
77 _count++;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
78 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
79
0
a61af66fc99e Initial load
duke
parents:
diff changeset
80 void decrement_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _count--;
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
82 assert(_count >= 0, "Count should not be negative");
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
83 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Construct a list without any entries.
a61af66fc99e Initial load
duke
parents:
diff changeset
88 FreeList();
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Construct a list with "fc" as the first (and lone) entry in the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 FreeList(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // Construct a list which will have a FreeChunk at address "addr" and
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // of size "size" as the first (and lone) entry in the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
93 FreeList(HeapWord* addr, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Reset the head, tail, hint, and count of a free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void reset(size_t hint);
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Declare the current free list to be protected by the given lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
99 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void set_protecting_lock(Mutex* protecting_lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _protecting_lock = protecting_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
103 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
106 FreeChunk* head() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 return _head;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void set_head(FreeChunk* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
112 _head = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 assert(!_head || _head->size() == _size, "bad chunk size");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // Set the head of the list and set the prev field of non-null
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // values to NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void link_head(FreeChunk* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
119 set_head(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // If this method is not used (just set the head instead),
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // this check can be avoided.
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (v != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 v->linkPrev(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 FreeChunk* tail() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
128 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
129 return _tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void set_tail(FreeChunk* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _tail = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 assert(!_tail || _tail->size() == _size, "bad chunk size");
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Set the tail of the list and set the next field of non-null
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // values to NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
138 void link_tail(FreeChunk* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
140 set_tail(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 if (v != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 v->clearNext();
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // No locking checks in read-accessors: lock-free reads (only) are benign.
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Readers are expected to have the lock if they are doing work that
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // requires atomicity guarantees in sections of code.
a61af66fc99e Initial load
duke
parents:
diff changeset
149 size_t size() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return _size;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 void set_size(size_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 _size = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 ssize_t count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 size_t hint() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 return _hint;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 void set_hint(size_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
164 assert(v == 0 || _size < v, "Bad hint"); _hint = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Accessors for statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
168 AllocationStats* allocation_stats() {
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
170 return &_allocation_stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 ssize_t desired() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 return _allocation_stats.desired();
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
176 void set_desired(ssize_t v) {
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
177 assert_proper_lock_protection();
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
178 _allocation_stats.set_desired(v);
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
179 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void compute_desired(float inter_sweep_current,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
181 float inter_sweep_estimate,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
182 float intra_sweep_estimate) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
183 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
184 _allocation_stats.compute_desired(_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
185 inter_sweep_current,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
186 inter_sweep_estimate,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
187 intra_sweep_estimate);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 ssize_t coalDesired() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 return _allocation_stats.coalDesired();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 void set_coalDesired(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
194 _allocation_stats.set_coalDesired(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 ssize_t surplus() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 return _allocation_stats.surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200 void set_surplus(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
202 _allocation_stats.set_surplus(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 void increment_surplus() {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
206 _allocation_stats.increment_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 void decrement_surplus() {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
210 _allocation_stats.decrement_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 ssize_t bfrSurp() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return _allocation_stats.bfrSurp();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 void set_bfrSurp(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 _allocation_stats.set_bfrSurp(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 ssize_t prevSweep() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 return _allocation_stats.prevSweep();
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 void set_prevSweep(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
225 _allocation_stats.set_prevSweep(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 ssize_t beforeSweep() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 return _allocation_stats.beforeSweep();
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 void set_beforeSweep(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 _allocation_stats.set_beforeSweep(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 ssize_t coalBirths() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 return _allocation_stats.coalBirths();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 void set_coalBirths(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 _allocation_stats.set_coalBirths(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 void increment_coalBirths() {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
244 _allocation_stats.increment_coalBirths();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 ssize_t coalDeaths() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 return _allocation_stats.coalDeaths();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void set_coalDeaths(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 _allocation_stats.set_coalDeaths(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 void increment_coalDeaths() {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 _allocation_stats.increment_coalDeaths();
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 ssize_t splitBirths() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return _allocation_stats.splitBirths();
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 void set_splitBirths(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 _allocation_stats.set_splitBirths(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void increment_splitBirths() {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
268 _allocation_stats.increment_splitBirths();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 ssize_t splitDeaths() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 return _allocation_stats.splitDeaths();
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274 void set_splitDeaths(ssize_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
276 _allocation_stats.set_splitDeaths(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void increment_splitDeaths() {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 _allocation_stats.increment_splitDeaths();
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // For debugging. The "_returnedBytes" in all the lists are summed
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // and compared with the total number of bytes swept during a
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 size_t returnedBytes() const { return _allocation_stats.returnedBytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 void set_returnedBytes(size_t v) { _allocation_stats.set_returnedBytes(v); }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 void increment_returnedBytes_by(size_t v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 _allocation_stats.set_returnedBytes(_allocation_stats.returnedBytes() + v);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292 )
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Unlink head of list and return it. Returns NULL if
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // the list is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
296 FreeChunk* getChunkAtHead();
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Remove the first "n" or "count", whichever is smaller, chunks from the
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // list, setting "fl", which is required to be empty, to point to them.
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void getFirstNChunksFromList(size_t n, FreeList* fl);
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // Unlink this chunk from it's free list
a61af66fc99e Initial load
duke
parents:
diff changeset
303 void removeChunk(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // Add this chunk to this free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
306 void returnChunkAtHead(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 void returnChunkAtTail(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // Similar to returnChunk* but also records some diagnostic
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // information.
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void returnChunkAtHead(FreeChunk* fc, bool record_return);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 void returnChunkAtTail(FreeChunk* fc, bool record_return);
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // Prepend "fl" (whose size is required to be the same as that of "this")
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // to the front of "this" list.
a61af66fc99e Initial load
duke
parents:
diff changeset
316 void prepend(FreeList* fl);
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Verify that the chunk is in the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // found. Return NULL if "fc" is not found.
a61af66fc99e Initial load
duke
parents:
diff changeset
320 bool verifyChunkInFreeLists(FreeChunk* fc) const;
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
321
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
322 // Stats verification
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
323 void verify_stats() const PRODUCT_RETURN;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
324
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
325 // Printing support
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
326 static void print_labels_on(outputStream* st, const char* c);
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
327 void print_on(outputStream* st, const char* c = NULL) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
328 };