annotate src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.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 05f89f00a864
children 0bfd3fb24150
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
579
0fbdb4381b99 6814575: Update copyright year
xdono
parents: 534
diff changeset
2 * Copyright 2001-2009 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 // ConcurrentMarkSweepGeneration is in support of a concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // mark-sweep old generation in the Detlefs-Printezis--Boehm-Demers-Schenker
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // style. We assume, for now, that this generation is always the
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // seniormost generation (modulo the PermGeneration), and for simplicity
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // in the first implementation, that this generation is a single compactible
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // space. Neither of these restrictions appears essential, and will be
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // relaxed in the future when more time is available to implement the
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // greater generality (and there's a need for it).
a61af66fc99e Initial load
duke
parents:
diff changeset
33 //
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // Concurrent mode failures are currently handled by
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // means of a sliding mark-compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class CMSAdaptiveSizePolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class CMSConcMarkingTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class CMSGCAdaptivePolicyCounters;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class ConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class ConcurrentMarkSweepPolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class FreeChunk;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class PromotionInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class ScanMarkedObjectsAgainCarefullyClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // A generic CMS bit map. It's the basis for both the CMS marking bit map
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // as well as for the mod union table (in each case only a subset of the
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // methods are used). This is essentially a wrapper around the BitMap class,
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // with one bit per (1<<_shifter) HeapWords. (i.e. for the marking bit map,
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // we have _shifter == 0. and for the mod union table we have
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // shifter == CardTableModRefBS::card_shift - LogHeapWordSize.)
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // XXX 64-bit issues in BitMap?
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class CMSBitMap VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 HeapWord* _bmStartWord; // base address of range covered by map
a61af66fc99e Initial load
duke
parents:
diff changeset
59 size_t _bmWordSize; // map size (in #HeapWords covered)
a61af66fc99e Initial load
duke
parents:
diff changeset
60 const int _shifter; // shifts to convert HeapWord to bit position
a61af66fc99e Initial load
duke
parents:
diff changeset
61 VirtualSpace _virtual_space; // underlying the bit map
a61af66fc99e Initial load
duke
parents:
diff changeset
62 BitMap _bm; // the bit map itself
a61af66fc99e Initial load
duke
parents:
diff changeset
63 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
64 Mutex* const _lock; // mutex protecting _bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
68 CMSBitMap(int shifter, int mutex_rank, const char* mutex_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // allocates the actual storage for the map
a61af66fc99e Initial load
duke
parents:
diff changeset
71 bool allocate(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // field getter
a61af66fc99e Initial load
duke
parents:
diff changeset
73 Mutex* lock() const { return _lock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // locking verifier convenience function
a61af66fc99e Initial load
duke
parents:
diff changeset
75 void assert_locked() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // inquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
78 HeapWord* startWord() const { return _bmStartWord; }
a61af66fc99e Initial load
duke
parents:
diff changeset
79 size_t sizeInWords() const { return _bmWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
80 size_t sizeInBits() const { return _bm.size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // the following is one past the last word in space
a61af66fc99e Initial load
duke
parents:
diff changeset
82 HeapWord* endWord() const { return _bmStartWord + _bmWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // reading marks
a61af66fc99e Initial load
duke
parents:
diff changeset
85 bool isMarked(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 bool par_isMarked(HeapWord* addr) const; // do not lock checks
a61af66fc99e Initial load
duke
parents:
diff changeset
87 bool isUnmarked(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 bool isAllClear() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // writing marks
a61af66fc99e Initial load
duke
parents:
diff changeset
91 void mark(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // For marking by parallel GC threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // returns true if we did, false if another thread did
a61af66fc99e Initial load
duke
parents:
diff changeset
94 bool par_mark(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void mark_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 void par_mark_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 void mark_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 void par_mark_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void par_clear(HeapWord* addr); // For unmarking by parallel GC threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 void clear_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void par_clear_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 void clear_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 void par_clear_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 void clear_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void clear_all_incrementally(); // Not yet implemented!!
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // checks the memory region for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void region_invariant(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 )
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void iterate(BitMapClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 _bm.iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void iterate(BitMapClosure* cl, HeapWord* left, HeapWord* right);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 void dirty_range_iterate_clear(MemRegionClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 void dirty_range_iterate_clear(MemRegion mr, MemRegionClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // auxiliary support for iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
122 HeapWord* getNextMarkedWordAddress(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 HeapWord* getNextMarkedWordAddress(HeapWord* start_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
124 HeapWord* end_addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 HeapWord* getNextUnmarkedWordAddress(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 HeapWord* getNextUnmarkedWordAddress(HeapWord* start_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
127 HeapWord* end_addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 MemRegion getAndClearMarkedRegion(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 MemRegion getAndClearMarkedRegion(HeapWord* start_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
130 HeapWord* end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // conversion utilities
a61af66fc99e Initial load
duke
parents:
diff changeset
133 HeapWord* offsetToHeapWord(size_t offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 size_t heapWordToOffset(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 size_t heapWordDiffToOffsetDiff(size_t diff) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // is this address range covered by the bit-map?
a61af66fc99e Initial load
duke
parents:
diff changeset
139 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
140 bool covers(MemRegion mr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 bool covers(HeapWord* start, size_t size = 0) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 )
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void verifyNoOneBitsInRange(HeapWord* left, HeapWord* right) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 };
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Represents a marking stack used by the CMS collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Ideally this should be GrowableArray<> just like MSC's marking stack(s).
a61af66fc99e Initial load
duke
parents:
diff changeset
148 class CMSMarkStack: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 //
a61af66fc99e Initial load
duke
parents:
diff changeset
150 friend class CMSCollector; // to get at expasion stats further below
a61af66fc99e Initial load
duke
parents:
diff changeset
151 //
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 VirtualSpace _virtual_space; // space for the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
154 oop* _base; // bottom of stack
a61af66fc99e Initial load
duke
parents:
diff changeset
155 size_t _index; // one more than last occupied index
a61af66fc99e Initial load
duke
parents:
diff changeset
156 size_t _capacity; // max #elements
a61af66fc99e Initial load
duke
parents:
diff changeset
157 Mutex _par_lock; // an advisory lock used in case of parallel access
a61af66fc99e Initial load
duke
parents:
diff changeset
158 NOT_PRODUCT(size_t _max_depth;) // max depth plumbed during run
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
161 size_t _hit_limit; // we hit max stack size limit
a61af66fc99e Initial load
duke
parents:
diff changeset
162 size_t _failed_double; // we failed expansion before hitting limit
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
165 CMSMarkStack():
a61af66fc99e Initial load
duke
parents:
diff changeset
166 _par_lock(Mutex::event, "CMSMarkStack._par_lock", true),
a61af66fc99e Initial load
duke
parents:
diff changeset
167 _hit_limit(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _failed_double(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 bool allocate(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 size_t capacity() const { return _capacity; }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 oop pop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 if (!isEmpty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 return _base[--_index] ;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 bool push(oop ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (isFull()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 _base[_index++] = ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
186 NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
a61af66fc99e Initial load
duke
parents:
diff changeset
187 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 bool isEmpty() const { return _index == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 bool isFull() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 assert(_index <= _capacity, "buffer overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
194 return _index == _capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 size_t length() { return _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // "Parallel versions" of some of the above
a61af66fc99e Initial load
duke
parents:
diff changeset
200 oop par_pop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // lock and pop
a61af66fc99e Initial load
duke
parents:
diff changeset
202 MutexLockerEx x(&_par_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 bool par_push(oop ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // lock and push
a61af66fc99e Initial load
duke
parents:
diff changeset
208 MutexLockerEx x(&_par_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 return push(ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // Forcibly reset the stack, losing all of its contents.
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Expand the stack, typically in response to an overflow condition
a61af66fc99e Initial load
duke
parents:
diff changeset
218 void expand();
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Compute the least valued stack element.
a61af66fc99e Initial load
duke
parents:
diff changeset
221 oop least_value(HeapWord* low) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 oop least = (oop)low;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 for (size_t i = 0; i < _index; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 least = MIN2(least, _base[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return least;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Exposed here to allow stack expansion in || case
a61af66fc99e Initial load
duke
parents:
diff changeset
230 Mutex* par_lock() { return &_par_lock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 };
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 class CardTableRS;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 class CMSParGCThreadState;
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 class ModUnionClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
238 CMSBitMap* _t;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
240 ModUnionClosure(CMSBitMap* t): _t(t) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 };
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 class ModUnionClosurePar: public ModUnionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
246 ModUnionClosurePar(CMSBitMap* t): ModUnionClosure(t) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 };
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Survivor Chunk Array in support of parallelization of
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // Survivor Space rescan.
a61af66fc99e Initial load
duke
parents:
diff changeset
252 class ChunkArray: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 size_t _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 size_t _capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 HeapWord** _array; // storage for array
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
258 ChunkArray() : _index(0), _capacity(0), _array(NULL) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
259 ChunkArray(HeapWord** a, size_t c):
a61af66fc99e Initial load
duke
parents:
diff changeset
260 _index(0), _capacity(c), _array(a) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 HeapWord** array() { return _array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 void set_array(HeapWord** a) { _array = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 size_t capacity() { return _capacity; }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void set_capacity(size_t c) { _capacity = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 size_t end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 assert(_index < capacity(), "_index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
270 return _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 } // exclusive
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 HeapWord* nth(size_t n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 assert(n < end(), "Out of bounds access");
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return _array[n];
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 void record_sample(HeapWord* p, size_t sz) {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // For now we do not do anything with the size
a61af66fc99e Initial load
duke
parents:
diff changeset
284 if (_index < _capacity) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _array[_index++] = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 };
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 //
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Timing, allocation and promotion statistics for gc scheduling and incremental
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // mode pacing. Most statistics are exponential averages.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 //
a61af66fc99e Initial load
duke
parents:
diff changeset
294 class CMSStats VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
296 ConcurrentMarkSweepGeneration* const _cms_gen; // The cms (old) gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // The following are exponential averages with factor alpha:
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // avg = (100 - alpha) * avg + alpha * cur_sample
a61af66fc99e Initial load
duke
parents:
diff changeset
300 //
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // The durations measure: end_time[n] - start_time[n]
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // The periods measure: start_time[n] - start_time[n-1]
a61af66fc99e Initial load
duke
parents:
diff changeset
303 //
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // The cms period and duration include only concurrent collections; time spent
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // in foreground cms collections due to System.gc() or because of a failure to
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // keep up are not included.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 //
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // There are 3 alphas to "bootstrap" the statistics. The _saved_alpha is the
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // real value, but is used only after the first period. A value of 100 is
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // used for the first sample so it gets the entire weight.
a61af66fc99e Initial load
duke
parents:
diff changeset
311 unsigned int _saved_alpha; // 0-100
a61af66fc99e Initial load
duke
parents:
diff changeset
312 unsigned int _gc0_alpha;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 unsigned int _cms_alpha;
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 double _gc0_duration;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 double _gc0_period;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 size_t _gc0_promoted; // bytes promoted per gc0
a61af66fc99e Initial load
duke
parents:
diff changeset
318 double _cms_duration;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 double _cms_duration_pre_sweep; // time from initiation to start of sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
320 double _cms_duration_per_mb;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 double _cms_period;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 size_t _cms_allocated; // bytes of direct allocation per gc0 period
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // Timers.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 elapsedTimer _cms_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
326 TimeStamp _gc0_begin_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
327 TimeStamp _cms_begin_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
328 TimeStamp _cms_end_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Snapshots of the amount used in the CMS generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
331 size_t _cms_used_at_gc0_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 size_t _cms_used_at_gc0_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 size_t _cms_used_at_cms_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // Used to prevent the duty cycle from being reduced in the middle of a cms
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // cycle.
a61af66fc99e Initial load
duke
parents:
diff changeset
337 bool _allow_duty_cycle_reduction;
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 _GC0_VALID = 0x1,
a61af66fc99e Initial load
duke
parents:
diff changeset
341 _CMS_VALID = 0x2,
a61af66fc99e Initial load
duke
parents:
diff changeset
342 _ALL_VALID = _GC0_VALID | _CMS_VALID
a61af66fc99e Initial load
duke
parents:
diff changeset
343 };
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 unsigned int _valid_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 unsigned int _icms_duty_cycle; // icms duty cycle (0-100).
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // Return a duty cycle that avoids wild oscillations, by limiting the amount
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // of change between old_duty_cycle and new_duty_cycle (the latter is treated
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // as a recommended value).
a61af66fc99e Initial load
duke
parents:
diff changeset
354 static unsigned int icms_damped_duty_cycle(unsigned int old_duty_cycle,
a61af66fc99e Initial load
duke
parents:
diff changeset
355 unsigned int new_duty_cycle);
a61af66fc99e Initial load
duke
parents:
diff changeset
356 unsigned int icms_update_duty_cycle_impl();
a61af66fc99e Initial load
duke
parents:
diff changeset
357
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
358 // In support of adjusting of cms trigger ratios based on history
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
359 // of concurrent mode failure.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
360 double cms_free_adjustment_factor(size_t free) const;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
361 void adjust_cms_free_adjustment_factor(bool fail, size_t free);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
362
0
a61af66fc99e Initial load
duke
parents:
diff changeset
363 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
364 CMSStats(ConcurrentMarkSweepGeneration* cms_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
365 unsigned int alpha = CMSExpAvgFactor);
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // Whether or not the statistics contain valid data; higher level statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // cannot be called until this returns true (they require at least one young
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // gen and one cms cycle to have completed).
a61af66fc99e Initial load
duke
parents:
diff changeset
370 bool valid() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // Record statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
373 void record_gc0_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void record_gc0_end(size_t cms_gen_bytes_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 void record_cms_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
376 void record_cms_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Allow management of the cms timer, which must be stopped/started around
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // yield points.
a61af66fc99e Initial load
duke
parents:
diff changeset
380 elapsedTimer& cms_timer() { return _cms_timer; }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 void start_cms_timer() { _cms_timer.start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 void stop_cms_timer() { _cms_timer.stop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // Basic statistics; units are seconds or bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
385 double gc0_period() const { return _gc0_period; }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 double gc0_duration() const { return _gc0_duration; }
a61af66fc99e Initial load
duke
parents:
diff changeset
387 size_t gc0_promoted() const { return _gc0_promoted; }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 double cms_period() const { return _cms_period; }
a61af66fc99e Initial load
duke
parents:
diff changeset
389 double cms_duration() const { return _cms_duration; }
a61af66fc99e Initial load
duke
parents:
diff changeset
390 double cms_duration_per_mb() const { return _cms_duration_per_mb; }
a61af66fc99e Initial load
duke
parents:
diff changeset
391 size_t cms_allocated() const { return _cms_allocated; }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 size_t cms_used_at_gc0_end() const { return _cms_used_at_gc0_end;}
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // Seconds since the last background cms cycle began or ended.
a61af66fc99e Initial load
duke
parents:
diff changeset
396 double cms_time_since_begin() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 double cms_time_since_end() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // Higher level statistics--caller must check that valid() returns true before
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // calling.
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // Returns bytes promoted per second of wall clock time.
a61af66fc99e Initial load
duke
parents:
diff changeset
403 double promotion_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Returns bytes directly allocated per second of wall clock time.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 double cms_allocation_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Rate at which space in the cms generation is being consumed (sum of the
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // above two).
a61af66fc99e Initial load
duke
parents:
diff changeset
410 double cms_consumption_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // Returns an estimate of the number of seconds until the cms generation will
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // fill up, assuming no collection work is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
414 double time_until_cms_gen_full() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Returns an estimate of the number of seconds remaining until
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // the cms generation collection should start.
a61af66fc99e Initial load
duke
parents:
diff changeset
418 double time_until_cms_start() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // End of higher level statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Returns the cms incremental mode duty cycle, as a percentage (0-100).
a61af66fc99e Initial load
duke
parents:
diff changeset
423 unsigned int icms_duty_cycle() const { return _icms_duty_cycle; }
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Update the duty cycle and return the new value.
a61af66fc99e Initial load
duke
parents:
diff changeset
426 unsigned int icms_update_duty_cycle();
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
429 void print_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 void print() const { print_on(gclog_or_tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
431 };
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // A closure related to weak references processing which
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // we embed in the CMSCollector, since we need to pass
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // it to the reference processor for secondary filtering
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // of references based on reachability of referent;
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // see role of _is_alive_non_header closure in the
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // ReferenceProcessor class.
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // For objects in the CMS generation, this closure checks
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // if the object is "live" (reachable). Used in weak
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // reference processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
442 class CMSIsAliveClosure: public BoolObjectClosure {
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
443 const MemRegion _span;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
444 const CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
447 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
448 CMSIsAliveClosure(MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
449 CMSBitMap* bit_map):
a61af66fc99e Initial load
duke
parents:
diff changeset
450 _span(span),
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
451 _bit_map(bit_map) {
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
452 assert(!span.is_empty(), "Empty span could spell trouble");
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
453 }
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
454
0
a61af66fc99e Initial load
duke
parents:
diff changeset
455 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 assert(false, "not to be invoked");
a61af66fc99e Initial load
duke
parents:
diff changeset
457 }
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
458
0
a61af66fc99e Initial load
duke
parents:
diff changeset
459 bool do_object_b(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 };
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // Implements AbstractRefProcTaskExecutor for CMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
464 class CMSRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 CMSRefProcTaskExecutor(CMSCollector& collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
468 : _collector(collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
469 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // Executes a task using worker threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
472 virtual void execute(ProcessTask& task);
a61af66fc99e Initial load
duke
parents:
diff changeset
473 virtual void execute(EnqueueTask& task);
a61af66fc99e Initial load
duke
parents:
diff changeset
474 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
475 CMSCollector& _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 };
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 class CMSCollector: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 friend class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 friend class ConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 friend class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
484 friend class CMSParRemarkTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 friend class CMSConcMarkingTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 friend class CMSRefProcTaskProxy;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 friend class CMSRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 friend class ScanMarkedObjectsAgainCarefullyClosure; // for sampling eden
a61af66fc99e Initial load
duke
parents:
diff changeset
489 friend class SurvivorSpacePrecleanClosure; // --- ditto -------
a61af66fc99e Initial load
duke
parents:
diff changeset
490 friend class PushOrMarkClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
491 friend class Par_PushOrMarkClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
492 friend class MarkFromRootsClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // ... and for clearing cards
a61af66fc99e Initial load
duke
parents:
diff changeset
494 friend class Par_MarkFromRootsClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // ... and for clearing cards
a61af66fc99e Initial load
duke
parents:
diff changeset
496 friend class Par_ConcMarkingClosure; // to access _restart_addr etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
497 friend class MarkFromRootsVerifyClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
498 friend class PushAndMarkVerifyClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
499 friend class MarkRefsIntoAndScanClosure; // to access _overflow_list
a61af66fc99e Initial load
duke
parents:
diff changeset
500 friend class PushAndMarkClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
501 friend class Par_PushAndMarkClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
502 friend class CMSKeepAliveClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
503 friend class CMSDrainMarkingStackClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
504 friend class CMSInnerParMarkAndPushClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
505 NOT_PRODUCT(friend class ScanMarkedObjectsAgainClosure;) // assertion on _overflow_list
a61af66fc99e Initial load
duke
parents:
diff changeset
506 friend class ReleaseForegroundGC; // to access _foregroundGCShouldWait
a61af66fc99e Initial load
duke
parents:
diff changeset
507 friend class VM_CMS_Operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 friend class VM_CMS_Initial_Mark;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 friend class VM_CMS_Final_Remark;
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
512 jlong _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
513 void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 _time_of_last_gc = now;
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 OopTaskQueueSet* _task_queues;
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // Overflow list of grey objects, threaded through mark-word
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // Manipulated with CAS in the parallel/multi-threaded case.
a61af66fc99e Initial load
duke
parents:
diff changeset
521 oop _overflow_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // The following array-pair keeps track of mark words
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // displaced for accomodating overflow list above.
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // This code will likely be revisited under RFE#4922830.
a61af66fc99e Initial load
duke
parents:
diff changeset
525 GrowableArray<oop>* _preserved_oop_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 GrowableArray<markOop>* _preserved_mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 int* _hash_seed;
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // In support of multi-threaded concurrent phases
a61af66fc99e Initial load
duke
parents:
diff changeset
531 YieldingFlexibleWorkGang* _conc_workers;
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
534 CollectorCounters* _gc_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // Initialization Errors
a61af66fc99e Initial load
duke
parents:
diff changeset
537 bool _completed_initialization;
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // In support of ExplicitGCInvokesConcurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
540 static bool _full_gc_requested;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 unsigned int _collection_count_start;
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
542
0
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // Should we unload classes this concurrent cycle?
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
544 bool _should_unload_classes;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
545 unsigned int _concurrent_cycles_since_last_unload;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
546 unsigned int concurrent_cycles_since_last_unload() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
547 return _concurrent_cycles_since_last_unload;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
548 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // Did we (allow) unload classes in the previous concurrent cycle?
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
550 bool unloaded_classes_last_cycle() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
551 return concurrent_cycles_since_last_unload() == 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
798
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
553 // Root scanning options for perm gen
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
554 int _roots_scanning_options;
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
555 int roots_scanning_options() const { return _roots_scanning_options; }
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
556 void add_root_scanning_option(int o) { _roots_scanning_options |= o; }
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
557 void remove_root_scanning_option(int o) { _roots_scanning_options &= ~o; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // Verification support
a61af66fc99e Initial load
duke
parents:
diff changeset
560 CMSBitMap _verification_mark_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void verify_after_remark_work_1();
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void verify_after_remark_work_2();
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // true if any verification flag is on.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 bool _verifying;
a61af66fc99e Initial load
duke
parents:
diff changeset
566 bool verifying() const { return _verifying; }
a61af66fc99e Initial load
duke
parents:
diff changeset
567 void set_verifying(bool v) { _verifying = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // Collector policy
a61af66fc99e Initial load
duke
parents:
diff changeset
570 ConcurrentMarkSweepPolicy* _collector_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
571 ConcurrentMarkSweepPolicy* collector_policy() { return _collector_policy; }
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Check whether the gc time limit has been
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // exceeded and set the size policy flag
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // appropriately.
a61af66fc99e Initial load
duke
parents:
diff changeset
576 void check_gc_time_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // XXX Move these to CMSStats ??? FIX ME !!!
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
578 elapsedTimer _inter_sweep_timer; // time between sweeps
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
579 elapsedTimer _intra_sweep_timer; // time _in_ sweeps
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
580 // padded decaying average estimates of the above
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
581 AdaptivePaddedAverage _inter_sweep_estimate;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
582 AdaptivePaddedAverage _intra_sweep_estimate;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
585 ConcurrentMarkSweepGeneration* _cmsGen; // old gen (CMS)
a61af66fc99e Initial load
duke
parents:
diff changeset
586 ConcurrentMarkSweepGeneration* _permGen; // perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
587 MemRegion _span; // span covering above two
a61af66fc99e Initial load
duke
parents:
diff changeset
588 CardTableRS* _ct; // card table
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 // CMS marking support structures
a61af66fc99e Initial load
duke
parents:
diff changeset
591 CMSBitMap _markBitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
592 CMSBitMap _modUnionTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 CMSMarkStack _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
594 CMSMarkStack _revisitStack; // used to keep track of klassKlass objects
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // to revisit
a61af66fc99e Initial load
duke
parents:
diff changeset
596 CMSBitMap _perm_gen_verify_bit_map; // Mark bit map for perm gen verification support.
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 HeapWord* _restart_addr; // in support of marking stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
599 void lower_restart_addr(HeapWord* low);
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Counters in support of marking stack / work queue overflow handling:
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // a non-zero value indicates certain types of overflow events during
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // the current CMS cycle and could lead to stack resizing efforts at
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // an opportune future time.
a61af66fc99e Initial load
duke
parents:
diff changeset
605 size_t _ser_pmc_preclean_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 size_t _ser_pmc_remark_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 size_t _par_pmc_remark_ovflw;
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
608 size_t _ser_kac_preclean_ovflw;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
609 size_t _ser_kac_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 size_t _par_kac_ovflw;
534
5cfd8d19e546 6786503: Overflow list performance can be improved
ysr
parents: 517
diff changeset
611 NOT_PRODUCT(ssize_t _num_par_pushes;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // ("Weak") Reference processing support
a61af66fc99e Initial load
duke
parents:
diff changeset
614 ReferenceProcessor* _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
615 CMSIsAliveClosure _is_alive_closure;
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
616 // keep this textually after _markBitMap and _span; c'tor dependency
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 ConcurrentMarkSweepThread* _cmsThread; // the thread doing the work
a61af66fc99e Initial load
duke
parents:
diff changeset
619 ModUnionClosure _modUnionClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
620 ModUnionClosurePar _modUnionClosurePar;
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // CMS abstract state machine
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // initial_state: Idling
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // next_state(Idling) = {Marking}
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // next_state(Marking) = {Precleaning, Sweeping}
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // next_state(Precleaning) = {AbortablePreclean, FinalMarking}
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // next_state(AbortablePreclean) = {FinalMarking}
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // next_state(FinalMarking) = {Sweeping}
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // next_state(Sweeping) = {Resizing}
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // next_state(Resizing) = {Resetting}
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // next_state(Resetting) = {Idling}
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // The numeric values below are chosen so that:
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // . _collectorState <= Idling == post-sweep && pre-mark
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // . _collectorState in (Idling, Sweeping) == {initial,final}marking ||
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // precleaning || abortablePrecleanb
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
636 public:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637 enum CollectorState {
a61af66fc99e Initial load
duke
parents:
diff changeset
638 Resizing = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
639 Resetting = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
640 Idling = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
641 InitialMarking = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
642 Marking = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
643 Precleaning = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
644 AbortablePreclean = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
645 FinalMarking = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
646 Sweeping = 8
a61af66fc99e Initial load
duke
parents:
diff changeset
647 };
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
648 protected:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
649 static CollectorState _collectorState;
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // State related to prologue/epilogue invocation for my generations
a61af66fc99e Initial load
duke
parents:
diff changeset
652 bool _between_prologue_and_epilogue;
a61af66fc99e Initial load
duke
parents:
diff changeset
653
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // Signalling/State related to coordination between fore- and backgroud GC
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // Note: When the baton has been passed from background GC to foreground GC,
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // _foregroundGCIsActive is true and _foregroundGCShouldWait is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
657 static bool _foregroundGCIsActive; // true iff foreground collector is active or
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // wants to go active
a61af66fc99e Initial load
duke
parents:
diff changeset
659 static bool _foregroundGCShouldWait; // true iff background GC is active and has not
a61af66fc99e Initial load
duke
parents:
diff changeset
660 // yet passed the baton to the foreground GC
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // Support for CMSScheduleRemark (abortable preclean)
a61af66fc99e Initial load
duke
parents:
diff changeset
663 bool _abort_preclean;
a61af66fc99e Initial load
duke
parents:
diff changeset
664 bool _start_sampling;
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 int _numYields;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 size_t _numDirtyCards;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
668 size_t _sweep_count;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // number of full gc's since the last concurrent gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
670 uint _full_gcs_since_conc_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
671
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // occupancy used for bootstrapping stats
a61af66fc99e Initial load
duke
parents:
diff changeset
673 double _bootstrap_occupancy;
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // timer
a61af66fc99e Initial load
duke
parents:
diff changeset
676 elapsedTimer _timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // Timing, allocation and promotion statistics, used for scheduling.
a61af66fc99e Initial load
duke
parents:
diff changeset
679 CMSStats _stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // Allocation limits installed in the young gen, used only in
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // CMSIncrementalMode. When an allocation in the young gen would cross one of
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // these limits, the cms generation is notified and the cms thread is started
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // or stopped, respectively.
a61af66fc99e Initial load
duke
parents:
diff changeset
685 HeapWord* _icms_start_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
686 HeapWord* _icms_stop_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 enum CMS_op_type {
a61af66fc99e Initial load
duke
parents:
diff changeset
689 CMS_op_checkpointRootsInitial,
a61af66fc99e Initial load
duke
parents:
diff changeset
690 CMS_op_checkpointRootsFinal
a61af66fc99e Initial load
duke
parents:
diff changeset
691 };
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 void do_CMS_operation(CMS_op_type op);
a61af66fc99e Initial load
duke
parents:
diff changeset
694 bool stop_world_and_do(CMS_op_type op);
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 OopTaskQueueSet* task_queues() { return _task_queues; }
a61af66fc99e Initial load
duke
parents:
diff changeset
697 int* hash_seed(int i) { return &_hash_seed[i]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 YieldingFlexibleWorkGang* conc_workers() { return _conc_workers; }
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // Support for parallelizing Eden rescan in CMS remark phase
a61af66fc99e Initial load
duke
parents:
diff changeset
701 void sample_eden(); // ... sample Eden space top
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Support for parallelizing young gen rescan in CMS remark phase
a61af66fc99e Initial load
duke
parents:
diff changeset
705 Generation* _young_gen; // the younger gen
a61af66fc99e Initial load
duke
parents:
diff changeset
706 HeapWord** _top_addr; // ... Top of Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
707 HeapWord** _end_addr; // ... End of Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
708 HeapWord** _eden_chunk_array; // ... Eden partitioning array
a61af66fc99e Initial load
duke
parents:
diff changeset
709 size_t _eden_chunk_index; // ... top (exclusive) of array
a61af66fc99e Initial load
duke
parents:
diff changeset
710 size_t _eden_chunk_capacity; // ... max entries in array
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // Support for parallelizing survivor space rescan
a61af66fc99e Initial load
duke
parents:
diff changeset
713 HeapWord** _survivor_chunk_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
714 size_t _survivor_chunk_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 size_t _survivor_chunk_capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 size_t* _cursor;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 ChunkArray* _survivor_plab_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // Support for marking stack overflow handling
a61af66fc99e Initial load
duke
parents:
diff changeset
720 bool take_from_overflow_list(size_t num, CMSMarkStack* to_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 bool par_take_from_overflow_list(size_t num, OopTaskQueue* to_work_q);
a61af66fc99e Initial load
duke
parents:
diff changeset
722 void push_on_overflow_list(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 void par_push_on_overflow_list(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // the following is, obviously, not, in general, "MT-stable"
a61af66fc99e Initial load
duke
parents:
diff changeset
725 bool overflow_list_is_empty() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 void preserve_mark_if_necessary(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 void par_preserve_mark_if_necessary(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
729 void preserve_mark_work(oop p, markOop m);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 void restore_preserved_marks_if_any();
a61af66fc99e Initial load
duke
parents:
diff changeset
731 NOT_PRODUCT(bool no_preserved_marks() const;)
a61af66fc99e Initial load
duke
parents:
diff changeset
732 // in support of testing overflow code
a61af66fc99e Initial load
duke
parents:
diff changeset
733 NOT_PRODUCT(int _overflow_counter;)
a61af66fc99e Initial load
duke
parents:
diff changeset
734 NOT_PRODUCT(bool simulate_overflow();) // sequential
a61af66fc99e Initial load
duke
parents:
diff changeset
735 NOT_PRODUCT(bool par_simulate_overflow();) // MT version
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // CMS work methods
a61af66fc99e Initial load
duke
parents:
diff changeset
738 void checkpointRootsInitialWork(bool asynch); // initial checkpoint work
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // a return value of false indicates failure due to stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
741 bool markFromRootsWork(bool asynch); // concurrent marking work
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 public: // FIX ME!!! only for testing
a61af66fc99e Initial load
duke
parents:
diff changeset
744 bool do_marking_st(bool asynch); // single-threaded marking
a61af66fc99e Initial load
duke
parents:
diff changeset
745 bool do_marking_mt(bool asynch); // multi-threaded marking
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // concurrent precleaning work
a61af66fc99e Initial load
duke
parents:
diff changeset
750 size_t preclean_mod_union_table(ConcurrentMarkSweepGeneration* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
751 ScanMarkedObjectsAgainCarefullyClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 size_t preclean_card_table(ConcurrentMarkSweepGeneration* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
753 ScanMarkedObjectsAgainCarefullyClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // Does precleaning work, returning a quantity indicative of
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // the amount of "useful work" done.
a61af66fc99e Initial load
duke
parents:
diff changeset
756 size_t preclean_work(bool clean_refs, bool clean_survivors);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 void abortable_preclean(); // Preclean while looking for possible abort
a61af66fc99e Initial load
duke
parents:
diff changeset
758 void initialize_sequential_subtasks_for_young_gen_rescan(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // Helper function for above; merge-sorts the per-thread plab samples
a61af66fc99e Initial load
duke
parents:
diff changeset
760 void merge_survivor_plab_arrays(ContiguousSpace* surv);
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Resets (i.e. clears) the per-thread plab sample vectors
a61af66fc99e Initial load
duke
parents:
diff changeset
762 void reset_survivor_plab_arrays();
a61af66fc99e Initial load
duke
parents:
diff changeset
763
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // final (second) checkpoint work
a61af66fc99e Initial load
duke
parents:
diff changeset
765 void checkpointRootsFinalWork(bool asynch, bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
766 bool init_mark_was_synchronous);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // work routine for parallel version of remark
a61af66fc99e Initial load
duke
parents:
diff changeset
768 void do_remark_parallel();
a61af66fc99e Initial load
duke
parents:
diff changeset
769 // work routine for non-parallel version of remark
a61af66fc99e Initial load
duke
parents:
diff changeset
770 void do_remark_non_parallel();
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // reference processing work routine (during second checkpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
772 void refProcessingWork(bool asynch, bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // concurrent sweeping work
a61af66fc99e Initial load
duke
parents:
diff changeset
775 void sweepWork(ConcurrentMarkSweepGeneration* gen, bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // (concurrent) resetting of support data structures
a61af66fc99e Initial load
duke
parents:
diff changeset
778 void reset(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // Clear _expansion_cause fields of constituent generations
a61af66fc99e Initial load
duke
parents:
diff changeset
781 void clear_expansion_cause();
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // An auxilliary method used to record the ends of
a61af66fc99e Initial load
duke
parents:
diff changeset
784 // used regions of each generation to limit the extent of sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
785 void save_sweep_limits();
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // Resize the generations included in the collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
788 void compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // A work method used by foreground collection to determine
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // what type of collection (compacting or not, continuing or fresh)
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // it should do.
a61af66fc99e Initial load
duke
parents:
diff changeset
793 void decide_foreground_collection_type(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
794 bool* should_compact, bool* should_start_over);
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // A work method used by the foreground collector to do
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // a mark-sweep-compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
798 void do_compaction_work(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // A work method used by the foreground collector to do
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // a mark-sweep, after taking over from a possibly on-going
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // concurrent mark-sweep collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
803 void do_mark_sweep_work(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
804 CollectorState first_state, bool should_start_over);
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // If the backgrould GC is active, acquire control from the background
a61af66fc99e Initial load
duke
parents:
diff changeset
807 // GC and do the collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
808 void acquire_control_and_collect(bool full, bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // For synchronizing passing of control from background to foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
811 // GC. waitForForegroundGC() is called by the background
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // collector. It if had to wait for a foreground collection,
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // it returns true and the background collection should assume
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // that the collection was finished by the foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
816 bool waitForForegroundGC();
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // Incremental mode triggering: recompute the icms duty cycle and set the
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // allocation limits in the young gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
820 void icms_update_allocation_limits();
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 size_t block_size_using_printezis_bits(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
823 size_t block_size_if_printezis_bits(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 HeapWord* next_card_start_after_block(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
825
a61af66fc99e Initial load
duke
parents:
diff changeset
826 void setup_cms_unloading_and_verification_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
827 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
828 CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
a61af66fc99e Initial load
duke
parents:
diff changeset
829 ConcurrentMarkSweepGeneration* permGen,
a61af66fc99e Initial load
duke
parents:
diff changeset
830 CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
831 ConcurrentMarkSweepPolicy* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
832 ConcurrentMarkSweepThread* cmsThread() { return _cmsThread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 ReferenceProcessor* ref_processor() { return _ref_processor; }
a61af66fc99e Initial load
duke
parents:
diff changeset
835 void ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
836
a61af66fc99e Initial load
duke
parents:
diff changeset
837 Mutex* bitMapLock() const { return _markBitMap.lock(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 static CollectorState abstract_state() { return _collectorState; }
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 bool should_abort_preclean() const; // Whether preclean should be aborted.
a61af66fc99e Initial load
duke
parents:
diff changeset
841 size_t get_eden_used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
842 size_t get_eden_capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 ConcurrentMarkSweepGeneration* cmsGen() { return _cmsGen; }
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // locking checks
a61af66fc99e Initial load
duke
parents:
diff changeset
847 NOT_PRODUCT(static bool have_cms_token();)
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // XXXPERM bool should_collect(bool full, size_t size, bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
850 bool shouldConcurrentCollect();
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
853 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
854 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
855 bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
856 void collect_in_background(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
857 void collect_in_foreground(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // In support of ExplicitGCInvokesConcurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
860 static void request_full_gc(unsigned int full_gc_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // Should we unload classes in a particular concurrent cycle?
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
862 bool should_unload_classes() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
863 return _should_unload_classes;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
864 }
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
865 bool update_should_unload_classes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 void direct_allocated(HeapWord* start, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // Object is dead if not marked and current phase is sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
870 bool is_dead_obj(oop obj) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // After a promotion (of "start"), do any necessary marking.
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // If "par", then it's being done by a parallel GC thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // The last two args indicate if we need precise marking
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // and if so the size of the object so it can be dirtied
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // in its entirety.
a61af66fc99e Initial load
duke
parents:
diff changeset
877 void promoted(bool par, HeapWord* start,
a61af66fc99e Initial load
duke
parents:
diff changeset
878 bool is_obj_array, size_t obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
881 size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
882
a61af66fc99e Initial load
duke
parents:
diff changeset
883 void getFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 void releaseFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 bool haveFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 // GC prologue and epilogue
a61af66fc99e Initial load
duke
parents:
diff changeset
888 void gc_prologue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 jlong time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
892 if (_collectorState <= Idling) {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 // gc not in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
894 return _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // collection in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
897 return now;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
900
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // Support for parallel remark of survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
902 void* get_data_recorder(int thr_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 CMSBitMap* markBitMap() { return &_markBitMap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
905 void directAllocated(HeapWord* start, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // main CMS steps and related support
a61af66fc99e Initial load
duke
parents:
diff changeset
908 void checkpointRootsInitial(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 bool markFromRoots(bool asynch); // a return value of false indicates failure
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // due to stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
911 void preclean();
a61af66fc99e Initial load
duke
parents:
diff changeset
912 void checkpointRootsFinal(bool asynch, bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
913 bool init_mark_was_synchronous);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 void sweep(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // Check that the currently executing thread is the expected
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // one (foreground collector or background collector).
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
918 static void check_correct_thread_executing() PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // XXXPERM void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
920
a61af66fc99e Initial load
duke
parents:
diff changeset
921 bool is_cms_reachable(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // Performance Counter Support
a61af66fc99e Initial load
duke
parents:
diff changeset
924 CollectorCounters* counters() { return _gc_counters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // timer stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
927 void startTimer() { assert(!_timer.is_active(), "Error"); _timer.start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
928 void stopTimer() { assert( _timer.is_active(), "Error"); _timer.stop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
929 void resetTimer() { assert(!_timer.is_active(), "Error"); _timer.reset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
930 double timerValue() { assert(!_timer.is_active(), "Error"); return _timer.seconds(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 int yields() { return _numYields; }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 void resetYields() { _numYields = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 void incrementYields() { _numYields++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
935 void resetNumDirtyCards() { _numDirtyCards = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 void incrementNumDirtyCards(size_t num) { _numDirtyCards += num; }
a61af66fc99e Initial load
duke
parents:
diff changeset
937 size_t numDirtyCards() { return _numDirtyCards; }
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 static bool foregroundGCShouldWait() { return _foregroundGCShouldWait; }
a61af66fc99e Initial load
duke
parents:
diff changeset
940 static void set_foregroundGCShouldWait(bool v) { _foregroundGCShouldWait = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
941 static bool foregroundGCIsActive() { return _foregroundGCIsActive; }
a61af66fc99e Initial load
duke
parents:
diff changeset
942 static void set_foregroundGCIsActive(bool v) { _foregroundGCIsActive = v; }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
943 size_t sweep_count() const { return _sweep_count; }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
944 void increment_sweep_count() { _sweep_count++; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
945
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // Timers/stats for gc scheduling and incremental mode pacing.
a61af66fc99e Initial load
duke
parents:
diff changeset
947 CMSStats& stats() { return _stats; }
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 // Convenience methods that check whether CMSIncrementalMode is enabled and
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // forward to the corresponding methods in ConcurrentMarkSweepThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
951 static void start_icms();
a61af66fc99e Initial load
duke
parents:
diff changeset
952 static void stop_icms(); // Called at the end of the cms cycle.
a61af66fc99e Initial load
duke
parents:
diff changeset
953 static void disable_icms(); // Called before a foreground collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
954 static void enable_icms(); // Called after a foreground collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
955 void icms_wait(); // Called at yield points.
a61af66fc99e Initial load
duke
parents:
diff changeset
956
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // Adaptive size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
958 CMSAdaptiveSizePolicy* size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
959 CMSGCAdaptivePolicyCounters* gc_adaptive_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
960
a61af66fc99e Initial load
duke
parents:
diff changeset
961 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
962 void verify(bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
963 bool verify_after_remark();
a61af66fc99e Initial load
duke
parents:
diff changeset
964 void verify_ok_to_terminate() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
965 void verify_work_stacks_empty() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
966 void verify_overflow_empty() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // convenience methods in support of debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
969 static const size_t skip_header_HeapWords() PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
970 HeapWord* block_start(const void* p) const PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
973 CMSMarkStack* verification_mark_stack() { return &_markStack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
974 CMSBitMap* verification_mark_bm() { return &_verification_mark_bm; }
a61af66fc99e Initial load
duke
parents:
diff changeset
975
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // Get the bit map with a perm gen "deadness" information.
a61af66fc99e Initial load
duke
parents:
diff changeset
977 CMSBitMap* perm_gen_verify_bit_map() { return &_perm_gen_verify_bit_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
978
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // Initialization errors
a61af66fc99e Initial load
duke
parents:
diff changeset
980 bool completed_initialization() { return _completed_initialization; }
a61af66fc99e Initial load
duke
parents:
diff changeset
981 };
a61af66fc99e Initial load
duke
parents:
diff changeset
982
a61af66fc99e Initial load
duke
parents:
diff changeset
983 class CMSExpansionCause : public AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
984 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
985 enum Cause {
a61af66fc99e Initial load
duke
parents:
diff changeset
986 _no_expansion,
a61af66fc99e Initial load
duke
parents:
diff changeset
987 _satisfy_free_ratio,
a61af66fc99e Initial load
duke
parents:
diff changeset
988 _satisfy_promotion,
a61af66fc99e Initial load
duke
parents:
diff changeset
989 _satisfy_allocation,
a61af66fc99e Initial load
duke
parents:
diff changeset
990 _allocate_par_lab,
a61af66fc99e Initial load
duke
parents:
diff changeset
991 _allocate_par_spooling_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
992 _adaptive_size_policy
a61af66fc99e Initial load
duke
parents:
diff changeset
993 };
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // Return a string describing the cause of the expansion.
a61af66fc99e Initial load
duke
parents:
diff changeset
995 static const char* to_string(CMSExpansionCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
996 };
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 class ConcurrentMarkSweepGeneration: public CardGeneration {
a61af66fc99e Initial load
duke
parents:
diff changeset
999 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 friend class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 friend class ConcurrentMarkSweep;
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 static CMSCollector* _collector; // the collector that collects us
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 CompactibleFreeListSpace* _cmsSpace; // underlying space (only one for now)
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 GenerationCounters* _gen_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 GSpaceCounters* _space_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // Words directly allocated, used by CMSStats.
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 size_t _direct_allocated_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 // Non-product stat counters
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 int _numObjectsPromoted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 int _numWordsPromoted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 int _numObjectsAllocated;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 int _numWordsAllocated;
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // Used for sizing decisions
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 bool _incremental_collection_failed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 bool incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 return _incremental_collection_failed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 void set_incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 _incremental_collection_failed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 void clear_incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 _incremental_collection_failed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1034 // accessors
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1035 void set_expansion_cause(CMSExpansionCause::Cause v) { _expansion_cause = v;}
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1036 CMSExpansionCause::Cause expansion_cause() const { return _expansion_cause; }
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1037
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // For parallel young-gen GC support.
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 CMSParGCThreadState** _par_gc_thread_states;
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // Reason generation was expanded
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 CMSExpansionCause::Cause _expansion_cause;
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 // In support of MinChunkSize being larger than min object size
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 const double _dilatation_factor;
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 enum CollectionTypes {
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 Concurrent_collection_type = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 MS_foreground_collection_type = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 MSC_foreground_collection_type = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 Unknown_collection_type = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 CollectionTypes _debug_collection_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1056
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1057 // Fraction of current occupancy at which to start a CMS collection which
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1058 // will collect this generation (at least).
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1059 double _initiating_occupancy;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1060
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 // Shrink generation by specified size (returns false if unable to shrink)
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 virtual void shrink_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1064
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // Update statistics for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 virtual void update_gc_stats(int level, bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // Maximum available space in the generation (including uncommitted)
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 size_t max_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1072 // getter and initializer for _initiating_occupancy field.
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1073 double initiating_occupancy() const { return _initiating_occupancy; }
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1074 void init_initiating_occupancy(intx io, intx tr);
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1075
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 ConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 int level, CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 bool use_adaptive_freelists,
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 FreeBlockDictionary::DictionaryChoice);
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 CMSCollector* collector() const { return _collector; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 static void set_collector(CMSCollector* collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 assert(_collector == NULL, "already set");
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 _collector = collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 CompactibleFreeListSpace* cmsSpace() const { return _cmsSpace; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 Mutex* freelistLock() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1091
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 virtual Generation::Name kind() { return Generation::ConcurrentMarkSweep; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // Adaptive size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 CMSAdaptiveSizePolicy* size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
1096
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 bool refs_discovery_is_atomic() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 bool refs_discovery_is_mt() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // Note: CMS does MT-discovery during the parallel-remark
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // phases. Use ReferenceProcessorMTMutator to make refs
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // discovery MT-safe during such phases or other parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // discovery phases in the future. This may all go away
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // if/when we decide that refs discovery is sufficiently
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 // rare that the cost of the CAS's involved is in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // noise. That's a measurement that should be done, and
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // the code simplified if that turns out to be the case.
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1109
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // Override
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 virtual void ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
1112
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1113 // Grow generation by specified size (returns false if unable to grow)
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1114 bool grow_by(size_t bytes);
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1115 // Grow generation to reserved size.
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1116 bool grow_to_reserved();
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1117
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 void clear_expansion_cause() { _expansion_cause = CMSExpansionCause::_no_expansion; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // Space enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 size_t capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 size_t used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 size_t free() const;
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1124 double occupancy() const { return ((double)used())/((double)capacity()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 size_t contiguous_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 size_t unsafe_max_alloc_nogc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 // over-rides
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 MemRegion used_region() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 MemRegion used_region_at_save_marks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // Does a "full" (forced) collection invoked on this generation collect
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // all younger generations as well? Note that the second conjunct is a
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 // hack to allow the collection of the younger gen first if the flag is
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // set. This is better than using th policy's should_collect_gen0_first()
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // since that causes us to do an extra unnecessary pair of restart-&-stop-world.
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 virtual bool full_collects_younger_generations() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 return UseCMSCompactAtFullCollection && !CollectGen0First;
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 void space_iterate(SpaceClosure* blk, bool usedOnly = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // Support for compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 CompactibleSpace* first_compaction_space() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 // Adjust quantites in the generation affected by
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 // the compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 void reset_after_compaction();
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // Allocation support
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 HeapWord* allocate(size_t size, bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 HeapWord* have_lock_and_allocate(size_t size, bool tlab);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1152 oop promote(oop obj, size_t obj_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 HeapWord* par_allocate(size_t size, bool tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 return allocate(size, tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 // Incremental mode triggering.
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1160
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // Used by CMSStats to track direct allocation. The value is sampled and
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 // reset after each young gen collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 size_t direct_allocated_words() const { return _direct_allocated_words; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 void reset_direct_allocated_words() { _direct_allocated_words = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // Overrides for parallel promotion.
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 virtual oop par_promote(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 oop obj, markOop m, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // This one should not be called for CMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 virtual void par_promote_alloc_undo(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 HeapWord* obj, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 virtual void par_promote_alloc_done(int thread_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 virtual void par_oop_since_save_marks_iterate_done(int thread_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 virtual bool promotion_attempt_is_safe(size_t promotion_in_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 bool younger_handles_promotion_failure) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1178 // Inform this (non-young) generation that a promotion failure was
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1179 // encountered during a collection of a younger generation that
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1180 // promotes into this generation.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1181 virtual void promotion_failure_occurred();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1182
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 bool should_collect(bool full, size_t size, bool tlab);
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1184 virtual bool should_concurrent_collect() const;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1185 virtual bool is_too_full() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1190
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 HeapWord* expand_and_allocate(size_t word_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 bool tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 bool parallel = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // GC prologue and epilogue
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 void gc_prologue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 void gc_prologue_work(bool full, bool registerClosure,
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 ModUnionClosure* modUnionClosure);
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 void gc_epilogue_work(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // Time since last GC of this generation
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 jlong time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 return collector()->time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 collector()-> update_time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1209
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 // Allocation failure
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 void expand(size_t bytes, size_t expand_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 CMSExpansionCause::Cause cause);
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1213 virtual bool expand(size_t bytes, size_t expand_bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 void shrink(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 HeapWord* expand_and_par_lab_allocate(CMSParGCThreadState* ps, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 bool expand_and_ensure_spooling_space(PromotionInfo* promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1217
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // Iteration support and related enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 void save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 bool no_allocs_since_save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 void object_iterate_since_last_GC(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 void younger_refs_iterate(OopsInGenClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // Iteration support specific to CMS generations
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 void save_sweep_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
1226
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 // More iteration support
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 virtual void oop_iterate(MemRegion mr, OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 virtual void oop_iterate(OopClosure* cl);
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 452
diff changeset
1230 virtual void safe_object_iterate(ObjectClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 virtual void object_iterate(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1232
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // Need to declare the full complement of closures, whether we'll
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // override them or not, or get message from the compiler:
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // oop_since_save_marks_iterate_nv hides virtual function...
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 #define CMS_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 ALL_SINCE_SAVE_MARKS_CLOSURES(CMS_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // Smart allocation XXX -- move to CFLSpace?
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 void setNearLargestChunk();
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 bool isNearLargestChunk(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1243
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // Get the chunk at the end of the space. Delagates to
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 FreeChunk* find_chunk_at_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 // Overriding of unused functionality (sharing not yet supported with CMS)
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 void pre_adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 void post_compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
1251
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 void prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 void verify(bool allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1256
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 // Performance Counters support
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 virtual void update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 virtual void update_counters(size_t used);
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 void initialize_performance_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 CollectorCounters* counters() { return collector()->counters(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 // Support for parallel remark of survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 void* get_data_recorder(int thr_num) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 //Delegate to collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 return collector()->get_data_recorder(thr_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1268
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 const char* name() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 virtual const char* short_name() const { return "CMS"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 void printOccupancy(const char* s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 bool must_be_youngest() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 bool must_be_oldest() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 void compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1278
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 CollectionTypes debug_collection_type() { return _debug_collection_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 void rotate_debug_collection_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1282
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 class ASConcurrentMarkSweepGeneration : public ConcurrentMarkSweepGeneration {
a61af66fc99e Initial load
duke
parents:
diff changeset
1284
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 // Return the size policy from the heap's collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 // policy casted to CMSAdaptiveSizePolicy*.
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 CMSAdaptiveSizePolicy* cms_size_policy() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1288
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 // Resize the generation based on the adaptive size
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 // policy.
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 void resize(size_t cur_promo, size_t desired_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1292
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 // Return the GC counters from the collector policy
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 CMSGCAdaptivePolicyCounters* gc_adaptive_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1295
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 virtual void shrink_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1297
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 virtual void compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 ASConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 int level, CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 bool use_adaptive_freelists,
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 FreeBlockDictionary::DictionaryChoice
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 dictionaryChoice) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 ConcurrentMarkSweepGeneration(rs, initial_byte_size, level, ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 use_adaptive_freelists, dictionaryChoice) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1307
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 virtual const char* short_name() const { return "ASCMS"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 virtual Generation::Name kind() { return Generation::ASConcurrentMarkSweep; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1310
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 virtual void update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 virtual void update_counters(size_t used);
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1314
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 // Closures of various sorts used by CMS to accomplish its work
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 // This closure is used to check that a certain set of oops is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 class FalseClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1322 void do_oop(oop* p) { guarantee(false, "Should be an empty set"); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1323 void do_oop(narrowOop* p) { guarantee(false, "Should be an empty set"); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1325
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 // This closure is used to do concurrent marking from the roots
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // following the first checkpoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 class MarkFromRootsClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 CMSBitMap* _bitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 CMSBitMap* _mut;
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 CMSMarkStack* _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 CMSMarkStack* _revisitStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 int _skipBits;
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 HeapWord* _threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 DEBUG_ONLY(bool _verifying;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1340
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 MarkFromRootsClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 CMSBitMap* bitMap,
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 CMSMarkStack* markStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 CMSMarkStack* revisitStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 bool should_yield, bool verifying = false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1347 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 void reset(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1350
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 void scanOopsInOop(HeapWord* ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 // This closure is used to do concurrent multi-threaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 // marking from the roots following the first checkpoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 // XXX This should really be a subclass of The serial version
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 // above, but i have not had the time to refactor things cleanly.
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // That willbe done for Dolphin.
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 class Par_MarkFromRootsClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 MemRegion _whole_span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 CMSBitMap* _mut;
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 CMSMarkStack* _overflow_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 CMSMarkStack* _revisit_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 int _skip_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 HeapWord* _threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 CMSConcMarkingTask* _task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 Par_MarkFromRootsClosure(CMSConcMarkingTask* task, CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 CMSMarkStack* overflow_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 bool should_yield);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1383 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1385
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 void scan_oops_in_oop(HeapWord* ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 bool get_work_from_overflow_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1391
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 // The following closures are used to do certain kinds of verification of
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 // CMS marking.
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 class PushAndMarkVerifyClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 CMSBitMap* _verification_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 CMSBitMap* _cms_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 CMSMarkStack* _mark_stack;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1400 protected:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1401 void do_oop(oop p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1402 template <class T> inline void do_oop_work(T *p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1403 oop obj = oopDesc::load_decode_heap_oop_not_null(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1404 do_oop(obj);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1405 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 PushAndMarkVerifyClosure(CMSCollector* cms_collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 CMSBitMap* verification_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 CMSBitMap* cms_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 CMSMarkStack* mark_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 void do_oop(oop* p);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1413 void do_oop(narrowOop* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // Deal with a stack overflow condition
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 void handle_stack_overflow(HeapWord* lost);
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 class MarkFromRootsVerifyClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 CMSBitMap* _verification_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 CMSBitMap* _cms_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 PushAndMarkVerifyClosure _pam_verify_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 MarkFromRootsVerifyClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 CMSBitMap* verification_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 CMSBitMap* cms_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 CMSMarkStack* mark_stack);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1431 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 void reset(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1434
a61af66fc99e Initial load
duke
parents:
diff changeset
1435
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 // This closure is used to check that a certain set of bits is
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 // "empty" (i.e. the bit vector doesn't have any 1-bits).
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 class FalseBitMapClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 public:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1440 bool do_bit(size_t offset) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 guarantee(false, "Should not have a 1 bit");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1442 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1445
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 // This closure is used during the second checkpointing phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 // to rescan the marked objects on the dirty cards in the mod
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 // union table and the card table proper. It's invoked via
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // MarkFromDirtyCardsClosure below. It uses either
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 // [Par_]MarkRefsIntoAndScanClosure (Par_ in the parallel case)
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 // declared in genOopClosures.hpp to accomplish some of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 // In the parallel case the bitMap is shared, so access to
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 // it needs to be suitably synchronized for updates by embedded
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 // closures that update it; however, this closure itself only
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 // reads the bit_map and because it is idempotent, is immune to
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 // reading stale values.
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 class ScanMarkedObjectsAgainClosure: public UpwardsObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 union {
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 bool _parallel;
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 union {
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 MarkRefsIntoAndScanClosure* _scan_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 Par_MarkRefsIntoAndScanClosure* _par_scan_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1472
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 ScanMarkedObjectsAgainClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 _mark_stack(mark_stack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 _parallel(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 _scan_closure(cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1489
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 ScanMarkedObjectsAgainClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 Par_MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 _work_queue(work_queue),
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 _parallel(true),
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 _par_scan_closure(cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1505
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 guarantee(false, "Call do_object_b(oop, MemRegion) instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 bool do_object_b(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 guarantee(false, "Call do_object_b(oop, MemRegion) form instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 bool do_object_bm(oop p, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1515
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 // This closure is used during the second checkpointing phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 // to rescan the marked objects on the dirty cards in the mod
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 // union table and the card table proper. It invokes
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 // ScanMarkedObjectsAgainClosure above to accomplish much of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 // In the parallel case, the bit map is shared and requires
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 // synchronized access.
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 class MarkFromDirtyCardsClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 CompactibleFreeListSpace* _space;
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 ScanMarkedObjectsAgainClosure _scan_cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 size_t _num_dirty_cards;
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 MarkFromDirtyCardsClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 CompactibleFreeListSpace* space,
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 _space(space),
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 _num_dirty_cards(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 _scan_cl(collector, span, collector->ref_processor(), bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 mark_stack, revisit_stack, cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1539
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 MarkFromDirtyCardsClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 CompactibleFreeListSpace* space,
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 Par_MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 _space(space),
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 _num_dirty_cards(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 _scan_cl(collector, span, collector->ref_processor(), bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 work_queue, revisit_stack, cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 void set_space(CompactibleFreeListSpace* space) { _space = space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 size_t num_dirty_cards() { return _num_dirty_cards; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1556
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 // This closure is used in the non-product build to check
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 // that there are no MemRegions with a certain property.
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 class FalseMemRegionClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 void do_MemRegion(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 guarantee(!mr.is_empty(), "Shouldn't be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 guarantee(false, "Should never be here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1565
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 // This closure is used during the precleaning phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 // to "carefully" rescan marked objects on dirty cards.
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 // It uses MarkRefsIntoAndScanClosure declared in genOopClosures.hpp
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 // to accomplish some of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 class ScanMarkedObjectsAgainCarefullyClosure: public ObjectClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 Mutex* _freelistLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 CMSBitMap* _bitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 CMSMarkStack* _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 MarkRefsIntoAndScanClosure* _scanningClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1578
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 ScanMarkedObjectsAgainCarefullyClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 CMSBitMap* bitMap,
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 CMSMarkStack* markStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 CMSMarkStack* revisitStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 MarkRefsIntoAndScanClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 bool should_yield):
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 _yield(should_yield),
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 _bitMap(bitMap),
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 _markStack(markStack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 _scanningClosure(cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 void do_object(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 guarantee(false, "call do_object_careful instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1598
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 size_t do_object_careful(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 guarantee(false, "Unexpected caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1603
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 size_t do_object_careful_m(oop p, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1605
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 void setFreelistLock(Mutex* m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 _freelistLock = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 _scanningClosure->set_freelistLock(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1610
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 inline bool do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1613
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1616
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 class SurvivorSpacePrecleanClosure: public ObjectClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 PushAndMarkClosure* _scanning_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 unsigned int _before_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1625
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 SurvivorSpacePrecleanClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 PushAndMarkClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 unsigned int before_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 bool should_yield):
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 _yield(should_yield),
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 _mark_stack(mark_stack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 _scanning_closure(cl),
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 _before_count(before_count)
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1642
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 void do_object(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 guarantee(false, "call do_object_careful instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1646
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 size_t do_object_careful(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
1648
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 size_t do_object_careful_m(oop p, MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 guarantee(false, "Unexpected caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1653
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1658
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 // This closure is used to accomplish the sweeping work
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 // after the second checkpoint but before the concurrent reset
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 // phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 // Terminology
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 // left hand chunk (LHC) - block of one or more chunks currently being
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 // coalesced. The LHC is available for coalescing with a new chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 // right hand chunk (RHC) - block that is currently being swept that is
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 // free or garbage that can be coalesced with the LHC.
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 // _inFreeRange is true if there is currently a LHC
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 // _lastFreeRangeCoalesced is true if the LHC consists of more than one chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 // _freeRangeInFreeLists is true if the LHC is in the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 // _freeFinger is the address of the current LHC
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 class SweepClosure: public BlkClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 CMSCollector* _collector; // collector doing the work
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 ConcurrentMarkSweepGeneration* _g; // Generation being swept
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 CompactibleFreeListSpace* _sp; // Space being swept
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 HeapWord* _limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 Mutex* _freelistLock; // Free list lock (in space)
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 CMSBitMap* _bitMap; // Marking bit map (in
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 // generation)
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 bool _inFreeRange; // Indicates if we are in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 // midst of a free run
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 bool _freeRangeInFreeLists;
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 // Often, we have just found
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 // a free chunk and started
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 // a new free range; we do not
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 // eagerly remove this chunk from
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 // the free lists unless there is
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 // a possibility of coalescing.
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 // When true, this flag indicates
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 // that the _freeFinger below
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 // points to a potentially free chunk
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 // that may still be in the free lists
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 bool _lastFreeRangeCoalesced;
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 // free range contains chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 // coalesced
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 // Whether sweeping should be
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 // done with yields. For instance
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 // when done by the foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 // collector we shouldn't yield.
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 HeapWord* _freeFinger; // When _inFreeRange is set, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 // pointer to the "left hand
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 // chunk"
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 size_t _freeRangeSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 // When _inFreeRange is set, this
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 // indicates the accumulated size
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 // of the "left hand chunk"
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 size_t _numObjectsFreed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 size_t _numWordsFreed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 size_t _numObjectsLive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 size_t _numWordsLive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 size_t _numObjectsAlreadyFree;
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 size_t _numWordsAlreadyFree;
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 FreeChunk* _last_fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 // Code that is common to a free chunk or garbage when
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 // encountered during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 void doPostIsFreeOrGarbageChunk(FreeChunk *fc,
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 size_t chunkSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 // Process a free chunk during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 void doAlreadyFreeChunk(FreeChunk *fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 // Process a garbage chunk during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 size_t doGarbageChunk(FreeChunk *fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 // Process a live chunk during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 size_t doLiveChunk(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1728
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 HeapWord* freeFinger() const { return _freeFinger; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 void set_freeFinger(HeapWord* v) { _freeFinger = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 size_t freeRangeSize() const { return _freeRangeSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 void set_freeRangeSize(size_t v) { _freeRangeSize = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 bool inFreeRange() const { return _inFreeRange; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 void set_inFreeRange(bool v) { _inFreeRange = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 bool lastFreeRangeCoalesced() const { return _lastFreeRangeCoalesced; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 void set_lastFreeRangeCoalesced(bool v) { _lastFreeRangeCoalesced = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 bool freeRangeInFreeLists() const { return _freeRangeInFreeLists; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 void set_freeRangeInFreeLists(bool v) { _freeRangeInFreeLists = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1740
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 // Initialize a free range.
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 void initialize_free_range(HeapWord* freeFinger, bool freeRangeInFreeLists);
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 // Return this chunk to the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 void flushCurFreeChunk(HeapWord* chunk, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1745
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 // Check if we should yield and do so when necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 inline void do_yield_check(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1748
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 // Yield
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 void do_yield_work(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1751
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 // Debugging/Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 void record_free_block_coalesced(FreeChunk* fc) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1754
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 SweepClosure(CMSCollector* collector, ConcurrentMarkSweepGeneration* g,
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 CMSBitMap* bitMap, bool should_yield);
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 ~SweepClosure();
a61af66fc99e Initial load
duke
parents:
diff changeset
1759
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 size_t do_blk_careful(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1762
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 // Closures related to weak references processing
a61af66fc99e Initial load
duke
parents:
diff changeset
1764
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 // During CMS' weak reference processing, this is a
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 // work-routine/closure used to complete transitive
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 // marking of objects as live after a certain point
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 // in which an initial set has been completely accumulated.
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1769 // This closure is currently used both during the final
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1770 // remark stop-world phase, as well as during the concurrent
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1771 // precleaning of the discovered reference lists.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 class CMSDrainMarkingStackClosure: public VoidClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 CMSKeepAliveClosure* _keep_alive;
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1778 bool _concurrent_precleaning;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 CMSDrainMarkingStackClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1782 CMSKeepAliveClosure* keep_alive,
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1783 bool cpc):
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 _mark_stack(mark_stack),
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1788 _keep_alive(keep_alive),
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1789 _concurrent_precleaning(cpc) {
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1790 assert(_concurrent_precleaning == _keep_alive->concurrent_precleaning(),
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1791 "Mismatch");
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1792 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1793
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 void do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1796
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 // A parallel version of CMSDrainMarkingStackClosure above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 class CMSParDrainMarkingStackClosure: public VoidClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 CMSInnerParMarkAndPushClosure _mark_and_push;
a61af66fc99e Initial load
duke
parents:
diff changeset
1804
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 CMSParDrainMarkingStackClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 MemRegion span, CMSBitMap* bit_map,
935
05f89f00a864 6798898: CMS: bugs related to class unloading
jmasa
parents: 798
diff changeset
1808 CMSMarkStack* revisit_stack,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 OopTaskQueue* work_queue):
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 _work_queue(work_queue),
935
05f89f00a864 6798898: CMS: bugs related to class unloading
jmasa
parents: 798
diff changeset
1814 _mark_and_push(collector, span, bit_map, revisit_stack, work_queue) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1815
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 void trim_queue(uint max);
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 void do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1820
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 // Allow yielding or short-circuiting of reference list
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 // prelceaning work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 class CMSPrecleanRefsYieldClosure: public YieldClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 CMSPrecleanRefsYieldClosure(CMSCollector* collector):
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 _collector(collector) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 virtual bool should_return();
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1831
a61af66fc99e Initial load
duke
parents:
diff changeset
1832
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 // Convenience class that locks free list locks for given CMS collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 class FreelistLocker: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 FreelistLocker(CMSCollector* collector):
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 _collector(collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 _collector->getFreelistLocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1842
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 ~FreelistLocker() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 _collector->releaseFreelistLocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1847
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // Mark all dead objects in a given space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 class MarkDeadObjectsClosure: public BlkClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 const CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 const CompactibleFreeListSpace* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 CMSBitMap* _live_bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 CMSBitMap* _dead_bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 MarkDeadObjectsClosure(const CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 const CompactibleFreeListSpace* sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 CMSBitMap *live_bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 CMSBitMap *dead_bit_map) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 _sp(sp),
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 _live_bit_map(live_bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 _dead_bit_map(dead_bit_map) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 size_t do_blk(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 };