annotate src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @ 452:00b023ae2d78

6722113: CMS: Incorrect overflow handling during precleaning of Reference lists Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery. Reviewed-by: apetrusenko, jcoomes
author ysr
date Thu, 20 Nov 2008 12:27:41 -0800
parents 1ee8caae33af
children e9be0e04635a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 143
diff changeset
2 * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // 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
a61af66fc99e Initial load
duke
parents:
diff changeset
358 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
359 CMSStats(ConcurrentMarkSweepGeneration* cms_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
360 unsigned int alpha = CMSExpAvgFactor);
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // Whether or not the statistics contain valid data; higher level statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // cannot be called until this returns true (they require at least one young
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // gen and one cms cycle to have completed).
a61af66fc99e Initial load
duke
parents:
diff changeset
365 bool valid() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // Record statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
368 void record_gc0_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
369 void record_gc0_end(size_t cms_gen_bytes_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 void record_cms_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
371 void record_cms_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // Allow management of the cms timer, which must be stopped/started around
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // yield points.
a61af66fc99e Initial load
duke
parents:
diff changeset
375 elapsedTimer& cms_timer() { return _cms_timer; }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 void start_cms_timer() { _cms_timer.start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
377 void stop_cms_timer() { _cms_timer.stop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // Basic statistics; units are seconds or bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
380 double gc0_period() const { return _gc0_period; }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 double gc0_duration() const { return _gc0_duration; }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 size_t gc0_promoted() const { return _gc0_promoted; }
a61af66fc99e Initial load
duke
parents:
diff changeset
383 double cms_period() const { return _cms_period; }
a61af66fc99e Initial load
duke
parents:
diff changeset
384 double cms_duration() const { return _cms_duration; }
a61af66fc99e Initial load
duke
parents:
diff changeset
385 double cms_duration_per_mb() const { return _cms_duration_per_mb; }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 size_t cms_allocated() const { return _cms_allocated; }
a61af66fc99e Initial load
duke
parents:
diff changeset
387
a61af66fc99e Initial load
duke
parents:
diff changeset
388 size_t cms_used_at_gc0_end() const { return _cms_used_at_gc0_end;}
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // Seconds since the last background cms cycle began or ended.
a61af66fc99e Initial load
duke
parents:
diff changeset
391 double cms_time_since_begin() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 double cms_time_since_end() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // Higher level statistics--caller must check that valid() returns true before
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // calling.
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Returns bytes promoted per second of wall clock time.
a61af66fc99e Initial load
duke
parents:
diff changeset
398 double promotion_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Returns bytes directly allocated per second of wall clock time.
a61af66fc99e Initial load
duke
parents:
diff changeset
401 double cms_allocation_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // Rate at which space in the cms generation is being consumed (sum of the
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // above two).
a61af66fc99e Initial load
duke
parents:
diff changeset
405 double cms_consumption_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // Returns an estimate of the number of seconds until the cms generation will
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // fill up, assuming no collection work is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
409 double time_until_cms_gen_full() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // Returns an estimate of the number of seconds remaining until
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // the cms generation collection should start.
a61af66fc99e Initial load
duke
parents:
diff changeset
413 double time_until_cms_start() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // End of higher level statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Returns the cms incremental mode duty cycle, as a percentage (0-100).
a61af66fc99e Initial load
duke
parents:
diff changeset
418 unsigned int icms_duty_cycle() const { return _icms_duty_cycle; }
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // Update the duty cycle and return the new value.
a61af66fc99e Initial load
duke
parents:
diff changeset
421 unsigned int icms_update_duty_cycle();
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // Debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
424 void print_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
425 void print() const { print_on(gclog_or_tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
426 };
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // A closure related to weak references processing which
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // we embed in the CMSCollector, since we need to pass
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // it to the reference processor for secondary filtering
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // of references based on reachability of referent;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // see role of _is_alive_non_header closure in the
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // ReferenceProcessor class.
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // For objects in the CMS generation, this closure checks
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // if the object is "live" (reachable). Used in weak
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // reference processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
437 class CMSIsAliveClosure: public BoolObjectClosure {
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
438 const MemRegion _span;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
439 const CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
442 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
443 CMSIsAliveClosure(MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
444 CMSBitMap* bit_map):
a61af66fc99e Initial load
duke
parents:
diff changeset
445 _span(span),
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
446 _bit_map(bit_map) {
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
447 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
448 }
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
449
0
a61af66fc99e Initial load
duke
parents:
diff changeset
450 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 assert(false, "not to be invoked");
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
453
0
a61af66fc99e Initial load
duke
parents:
diff changeset
454 bool do_object_b(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 };
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // Implements AbstractRefProcTaskExecutor for CMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 class CMSRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 CMSRefProcTaskExecutor(CMSCollector& collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
463 : _collector(collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
464 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Executes a task using worker threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
467 virtual void execute(ProcessTask& task);
a61af66fc99e Initial load
duke
parents:
diff changeset
468 virtual void execute(EnqueueTask& task);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
470 CMSCollector& _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
471 };
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 class CMSCollector: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 friend class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 friend class ConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
478 friend class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
479 friend class CMSParRemarkTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 friend class CMSConcMarkingTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 friend class CMSRefProcTaskProxy;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 friend class CMSRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 friend class ScanMarkedObjectsAgainCarefullyClosure; // for sampling eden
a61af66fc99e Initial load
duke
parents:
diff changeset
484 friend class SurvivorSpacePrecleanClosure; // --- ditto -------
a61af66fc99e Initial load
duke
parents:
diff changeset
485 friend class PushOrMarkClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
486 friend class Par_PushOrMarkClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
487 friend class MarkFromRootsClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // ... and for clearing cards
a61af66fc99e Initial load
duke
parents:
diff changeset
489 friend class Par_MarkFromRootsClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // ... and for clearing cards
a61af66fc99e Initial load
duke
parents:
diff changeset
491 friend class Par_ConcMarkingClosure; // to access _restart_addr etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
492 friend class MarkFromRootsVerifyClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
493 friend class PushAndMarkVerifyClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
494 friend class MarkRefsIntoAndScanClosure; // to access _overflow_list
a61af66fc99e Initial load
duke
parents:
diff changeset
495 friend class PushAndMarkClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
496 friend class Par_PushAndMarkClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
497 friend class CMSKeepAliveClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
498 friend class CMSDrainMarkingStackClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
499 friend class CMSInnerParMarkAndPushClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
500 NOT_PRODUCT(friend class ScanMarkedObjectsAgainClosure;) // assertion on _overflow_list
a61af66fc99e Initial load
duke
parents:
diff changeset
501 friend class ReleaseForegroundGC; // to access _foregroundGCShouldWait
a61af66fc99e Initial load
duke
parents:
diff changeset
502 friend class VM_CMS_Operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
503 friend class VM_CMS_Initial_Mark;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 friend class VM_CMS_Final_Remark;
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
507 jlong _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 _time_of_last_gc = now;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 OopTaskQueueSet* _task_queues;
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // Overflow list of grey objects, threaded through mark-word
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Manipulated with CAS in the parallel/multi-threaded case.
a61af66fc99e Initial load
duke
parents:
diff changeset
516 oop _overflow_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // The following array-pair keeps track of mark words
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // displaced for accomodating overflow list above.
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // This code will likely be revisited under RFE#4922830.
a61af66fc99e Initial load
duke
parents:
diff changeset
520 GrowableArray<oop>* _preserved_oop_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 GrowableArray<markOop>* _preserved_mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 int* _hash_seed;
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // In support of multi-threaded concurrent phases
a61af66fc99e Initial load
duke
parents:
diff changeset
526 YieldingFlexibleWorkGang* _conc_workers;
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
529 CollectorCounters* _gc_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // Initialization Errors
a61af66fc99e Initial load
duke
parents:
diff changeset
532 bool _completed_initialization;
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // In support of ExplicitGCInvokesConcurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
535 static bool _full_gc_requested;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 unsigned int _collection_count_start;
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
537
0
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Should we unload classes this concurrent cycle?
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
539 bool _should_unload_classes;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
540 unsigned int _concurrent_cycles_since_last_unload;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
541 unsigned int concurrent_cycles_since_last_unload() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
542 return _concurrent_cycles_since_last_unload;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
543 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // 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
545 bool unloaded_classes_last_cycle() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
546 return concurrent_cycles_since_last_unload() == 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // Verification support
a61af66fc99e Initial load
duke
parents:
diff changeset
550 CMSBitMap _verification_mark_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void verify_after_remark_work_1();
a61af66fc99e Initial load
duke
parents:
diff changeset
552 void verify_after_remark_work_2();
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // true if any verification flag is on.
a61af66fc99e Initial load
duke
parents:
diff changeset
555 bool _verifying;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 bool verifying() const { return _verifying; }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 void set_verifying(bool v) { _verifying = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // Collector policy
a61af66fc99e Initial load
duke
parents:
diff changeset
560 ConcurrentMarkSweepPolicy* _collector_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
561 ConcurrentMarkSweepPolicy* collector_policy() { return _collector_policy; }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Check whether the gc time limit has been
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // exceeded and set the size policy flag
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // appropriately.
a61af66fc99e Initial load
duke
parents:
diff changeset
566 void check_gc_time_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // XXX Move these to CMSStats ??? FIX ME !!!
a61af66fc99e Initial load
duke
parents:
diff changeset
568 elapsedTimer _sweep_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
569 AdaptivePaddedAverage _sweep_estimate;
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
572 ConcurrentMarkSweepGeneration* _cmsGen; // old gen (CMS)
a61af66fc99e Initial load
duke
parents:
diff changeset
573 ConcurrentMarkSweepGeneration* _permGen; // perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
574 MemRegion _span; // span covering above two
a61af66fc99e Initial load
duke
parents:
diff changeset
575 CardTableRS* _ct; // card table
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // CMS marking support structures
a61af66fc99e Initial load
duke
parents:
diff changeset
578 CMSBitMap _markBitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
579 CMSBitMap _modUnionTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
580 CMSMarkStack _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 CMSMarkStack _revisitStack; // used to keep track of klassKlass objects
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // to revisit
a61af66fc99e Initial load
duke
parents:
diff changeset
583 CMSBitMap _perm_gen_verify_bit_map; // Mark bit map for perm gen verification support.
a61af66fc99e Initial load
duke
parents:
diff changeset
584
a61af66fc99e Initial load
duke
parents:
diff changeset
585 HeapWord* _restart_addr; // in support of marking stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
586 void lower_restart_addr(HeapWord* low);
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // Counters in support of marking stack / work queue overflow handling:
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // a non-zero value indicates certain types of overflow events during
a61af66fc99e Initial load
duke
parents:
diff changeset
590 // the current CMS cycle and could lead to stack resizing efforts at
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // an opportune future time.
a61af66fc99e Initial load
duke
parents:
diff changeset
592 size_t _ser_pmc_preclean_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 size_t _ser_pmc_remark_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
594 size_t _par_pmc_remark_ovflw;
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
595 size_t _ser_kac_preclean_ovflw;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
596 size_t _ser_kac_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
597 size_t _par_kac_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
598 NOT_PRODUCT(size_t _num_par_pushes;)
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // ("Weak") Reference processing support
a61af66fc99e Initial load
duke
parents:
diff changeset
601 ReferenceProcessor* _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
602 CMSIsAliveClosure _is_alive_closure;
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
603 // keep this textually after _markBitMap and _span; c'tor dependency
0
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 ConcurrentMarkSweepThread* _cmsThread; // the thread doing the work
a61af66fc99e Initial load
duke
parents:
diff changeset
606 ModUnionClosure _modUnionClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 ModUnionClosurePar _modUnionClosurePar;
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // CMS abstract state machine
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // initial_state: Idling
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // next_state(Idling) = {Marking}
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // next_state(Marking) = {Precleaning, Sweeping}
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // next_state(Precleaning) = {AbortablePreclean, FinalMarking}
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // next_state(AbortablePreclean) = {FinalMarking}
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // next_state(FinalMarking) = {Sweeping}
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // next_state(Sweeping) = {Resizing}
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // next_state(Resizing) = {Resetting}
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // next_state(Resetting) = {Idling}
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // The numeric values below are chosen so that:
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // . _collectorState <= Idling == post-sweep && pre-mark
a61af66fc99e Initial load
duke
parents:
diff changeset
621 // . _collectorState in (Idling, Sweeping) == {initial,final}marking ||
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // precleaning || abortablePrecleanb
a61af66fc99e Initial load
duke
parents:
diff changeset
623 enum CollectorState {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 Resizing = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
625 Resetting = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
626 Idling = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
627 InitialMarking = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
628 Marking = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
629 Precleaning = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
630 AbortablePreclean = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
631 FinalMarking = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
632 Sweeping = 8
a61af66fc99e Initial load
duke
parents:
diff changeset
633 };
a61af66fc99e Initial load
duke
parents:
diff changeset
634 static CollectorState _collectorState;
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // State related to prologue/epilogue invocation for my generations
a61af66fc99e Initial load
duke
parents:
diff changeset
637 bool _between_prologue_and_epilogue;
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // Signalling/State related to coordination between fore- and backgroud GC
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // Note: When the baton has been passed from background GC to foreground GC,
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // _foregroundGCIsActive is true and _foregroundGCShouldWait is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
642 static bool _foregroundGCIsActive; // true iff foreground collector is active or
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // wants to go active
a61af66fc99e Initial load
duke
parents:
diff changeset
644 static bool _foregroundGCShouldWait; // true iff background GC is active and has not
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // yet passed the baton to the foreground GC
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // Support for CMSScheduleRemark (abortable preclean)
a61af66fc99e Initial load
duke
parents:
diff changeset
648 bool _abort_preclean;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 bool _start_sampling;
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 int _numYields;
a61af66fc99e Initial load
duke
parents:
diff changeset
652 size_t _numDirtyCards;
a61af66fc99e Initial load
duke
parents:
diff changeset
653 uint _sweepCount;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // number of full gc's since the last concurrent gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
655 uint _full_gcs_since_conc_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // occupancy used for bootstrapping stats
a61af66fc99e Initial load
duke
parents:
diff changeset
658 double _bootstrap_occupancy;
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 // timer
a61af66fc99e Initial load
duke
parents:
diff changeset
661 elapsedTimer _timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // Timing, allocation and promotion statistics, used for scheduling.
a61af66fc99e Initial load
duke
parents:
diff changeset
664 CMSStats _stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // Allocation limits installed in the young gen, used only in
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // CMSIncrementalMode. When an allocation in the young gen would cross one of
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // these limits, the cms generation is notified and the cms thread is started
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // or stopped, respectively.
a61af66fc99e Initial load
duke
parents:
diff changeset
670 HeapWord* _icms_start_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
671 HeapWord* _icms_stop_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 enum CMS_op_type {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 CMS_op_checkpointRootsInitial,
a61af66fc99e Initial load
duke
parents:
diff changeset
675 CMS_op_checkpointRootsFinal
a61af66fc99e Initial load
duke
parents:
diff changeset
676 };
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 void do_CMS_operation(CMS_op_type op);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 bool stop_world_and_do(CMS_op_type op);
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 OopTaskQueueSet* task_queues() { return _task_queues; }
a61af66fc99e Initial load
duke
parents:
diff changeset
682 int* hash_seed(int i) { return &_hash_seed[i]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
683 YieldingFlexibleWorkGang* conc_workers() { return _conc_workers; }
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Support for parallelizing Eden rescan in CMS remark phase
a61af66fc99e Initial load
duke
parents:
diff changeset
686 void sample_eden(); // ... sample Eden space top
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // Support for parallelizing young gen rescan in CMS remark phase
a61af66fc99e Initial load
duke
parents:
diff changeset
690 Generation* _young_gen; // the younger gen
a61af66fc99e Initial load
duke
parents:
diff changeset
691 HeapWord** _top_addr; // ... Top of Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
692 HeapWord** _end_addr; // ... End of Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
693 HeapWord** _eden_chunk_array; // ... Eden partitioning array
a61af66fc99e Initial load
duke
parents:
diff changeset
694 size_t _eden_chunk_index; // ... top (exclusive) of array
a61af66fc99e Initial load
duke
parents:
diff changeset
695 size_t _eden_chunk_capacity; // ... max entries in array
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // Support for parallelizing survivor space rescan
a61af66fc99e Initial load
duke
parents:
diff changeset
698 HeapWord** _survivor_chunk_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 size_t _survivor_chunk_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 size_t _survivor_chunk_capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 size_t* _cursor;
a61af66fc99e Initial load
duke
parents:
diff changeset
702 ChunkArray* _survivor_plab_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Support for marking stack overflow handling
a61af66fc99e Initial load
duke
parents:
diff changeset
705 bool take_from_overflow_list(size_t num, CMSMarkStack* to_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
706 bool par_take_from_overflow_list(size_t num, OopTaskQueue* to_work_q);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 void push_on_overflow_list(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
708 void par_push_on_overflow_list(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // the following is, obviously, not, in general, "MT-stable"
a61af66fc99e Initial load
duke
parents:
diff changeset
710 bool overflow_list_is_empty() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 void preserve_mark_if_necessary(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
713 void par_preserve_mark_if_necessary(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 void preserve_mark_work(oop p, markOop m);
a61af66fc99e Initial load
duke
parents:
diff changeset
715 void restore_preserved_marks_if_any();
a61af66fc99e Initial load
duke
parents:
diff changeset
716 NOT_PRODUCT(bool no_preserved_marks() const;)
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // in support of testing overflow code
a61af66fc99e Initial load
duke
parents:
diff changeset
718 NOT_PRODUCT(int _overflow_counter;)
a61af66fc99e Initial load
duke
parents:
diff changeset
719 NOT_PRODUCT(bool simulate_overflow();) // sequential
a61af66fc99e Initial load
duke
parents:
diff changeset
720 NOT_PRODUCT(bool par_simulate_overflow();) // MT version
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 int _roots_scanning_options;
a61af66fc99e Initial load
duke
parents:
diff changeset
723 int roots_scanning_options() const { return _roots_scanning_options; }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 void add_root_scanning_option(int o) { _roots_scanning_options |= o; }
a61af66fc99e Initial load
duke
parents:
diff changeset
725 void remove_root_scanning_option(int o) { _roots_scanning_options &= ~o; }
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 // CMS work methods
a61af66fc99e Initial load
duke
parents:
diff changeset
728 void checkpointRootsInitialWork(bool asynch); // initial checkpoint work
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // a return value of false indicates failure due to stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
731 bool markFromRootsWork(bool asynch); // concurrent marking work
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 public: // FIX ME!!! only for testing
a61af66fc99e Initial load
duke
parents:
diff changeset
734 bool do_marking_st(bool asynch); // single-threaded marking
a61af66fc99e Initial load
duke
parents:
diff changeset
735 bool do_marking_mt(bool asynch); // multi-threaded marking
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // concurrent precleaning work
a61af66fc99e Initial load
duke
parents:
diff changeset
740 size_t preclean_mod_union_table(ConcurrentMarkSweepGeneration* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
741 ScanMarkedObjectsAgainCarefullyClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
742 size_t preclean_card_table(ConcurrentMarkSweepGeneration* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
743 ScanMarkedObjectsAgainCarefullyClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // Does precleaning work, returning a quantity indicative of
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // the amount of "useful work" done.
a61af66fc99e Initial load
duke
parents:
diff changeset
746 size_t preclean_work(bool clean_refs, bool clean_survivors);
a61af66fc99e Initial load
duke
parents:
diff changeset
747 void abortable_preclean(); // Preclean while looking for possible abort
a61af66fc99e Initial load
duke
parents:
diff changeset
748 void initialize_sequential_subtasks_for_young_gen_rescan(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // Helper function for above; merge-sorts the per-thread plab samples
a61af66fc99e Initial load
duke
parents:
diff changeset
750 void merge_survivor_plab_arrays(ContiguousSpace* surv);
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // Resets (i.e. clears) the per-thread plab sample vectors
a61af66fc99e Initial load
duke
parents:
diff changeset
752 void reset_survivor_plab_arrays();
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // final (second) checkpoint work
a61af66fc99e Initial load
duke
parents:
diff changeset
755 void checkpointRootsFinalWork(bool asynch, bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
756 bool init_mark_was_synchronous);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // work routine for parallel version of remark
a61af66fc99e Initial load
duke
parents:
diff changeset
758 void do_remark_parallel();
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // work routine for non-parallel version of remark
a61af66fc99e Initial load
duke
parents:
diff changeset
760 void do_remark_non_parallel();
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // reference processing work routine (during second checkpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
762 void refProcessingWork(bool asynch, bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
763
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // concurrent sweeping work
a61af66fc99e Initial load
duke
parents:
diff changeset
765 void sweepWork(ConcurrentMarkSweepGeneration* gen, bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // (concurrent) resetting of support data structures
a61af66fc99e Initial load
duke
parents:
diff changeset
768 void reset(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
769
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // Clear _expansion_cause fields of constituent generations
a61af66fc99e Initial load
duke
parents:
diff changeset
771 void clear_expansion_cause();
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // An auxilliary method used to record the ends of
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // used regions of each generation to limit the extent of sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
775 void save_sweep_limits();
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // Resize the generations included in the collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
778 void compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // A work method used by foreground collection to determine
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // what type of collection (compacting or not, continuing or fresh)
a61af66fc99e Initial load
duke
parents:
diff changeset
782 // it should do.
a61af66fc99e Initial load
duke
parents:
diff changeset
783 void decide_foreground_collection_type(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
784 bool* should_compact, bool* should_start_over);
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // A work method used by the foreground collector to do
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // a mark-sweep-compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
788 void do_compaction_work(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // A work method used by the foreground collector to do
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // a mark-sweep, after taking over from a possibly on-going
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // concurrent mark-sweep collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
793 void do_mark_sweep_work(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
794 CollectorState first_state, bool should_start_over);
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // If the backgrould GC is active, acquire control from the background
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // GC and do the collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
798 void acquire_control_and_collect(bool full, bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // For synchronizing passing of control from background to foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // GC. waitForForegroundGC() is called by the background
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // collector. It if had to wait for a foreground collection,
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // it returns true and the background collection should assume
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // that the collection was finished by the foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
806 bool waitForForegroundGC();
a61af66fc99e Initial load
duke
parents:
diff changeset
807
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // Incremental mode triggering: recompute the icms duty cycle and set the
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // allocation limits in the young gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
810 void icms_update_allocation_limits();
a61af66fc99e Initial load
duke
parents:
diff changeset
811
a61af66fc99e Initial load
duke
parents:
diff changeset
812 size_t block_size_using_printezis_bits(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
813 size_t block_size_if_printezis_bits(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 HeapWord* next_card_start_after_block(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 void setup_cms_unloading_and_verification_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
817 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
818 CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
a61af66fc99e Initial load
duke
parents:
diff changeset
819 ConcurrentMarkSweepGeneration* permGen,
a61af66fc99e Initial load
duke
parents:
diff changeset
820 CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
821 ConcurrentMarkSweepPolicy* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
822 ConcurrentMarkSweepThread* cmsThread() { return _cmsThread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
823
a61af66fc99e Initial load
duke
parents:
diff changeset
824 ReferenceProcessor* ref_processor() { return _ref_processor; }
a61af66fc99e Initial load
duke
parents:
diff changeset
825 void ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 Mutex* bitMapLock() const { return _markBitMap.lock(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
828 static CollectorState abstract_state() { return _collectorState; }
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 bool should_abort_preclean() const; // Whether preclean should be aborted.
a61af66fc99e Initial load
duke
parents:
diff changeset
831 size_t get_eden_used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
832 size_t get_eden_capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 ConcurrentMarkSweepGeneration* cmsGen() { return _cmsGen; }
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // locking checks
a61af66fc99e Initial load
duke
parents:
diff changeset
837 NOT_PRODUCT(static bool have_cms_token();)
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839 // XXXPERM bool should_collect(bool full, size_t size, bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 bool shouldConcurrentCollect();
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842 void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
843 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
844 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
845 bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 void collect_in_background(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
847 void collect_in_foreground(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // In support of ExplicitGCInvokesConcurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
850 static void request_full_gc(unsigned int full_gc_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // 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
852 bool should_unload_classes() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
853 return _should_unload_classes;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
854 }
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
855 bool update_should_unload_classes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 void direct_allocated(HeapWord* start, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // Object is dead if not marked and current phase is sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
860 bool is_dead_obj(oop obj) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // After a promotion (of "start"), do any necessary marking.
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // If "par", then it's being done by a parallel GC thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // The last two args indicate if we need precise marking
a61af66fc99e Initial load
duke
parents:
diff changeset
865 // and if so the size of the object so it can be dirtied
a61af66fc99e Initial load
duke
parents:
diff changeset
866 // in its entirety.
a61af66fc99e Initial load
duke
parents:
diff changeset
867 void promoted(bool par, HeapWord* start,
a61af66fc99e Initial load
duke
parents:
diff changeset
868 bool is_obj_array, size_t obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
871 size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 void getFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
874 void releaseFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 bool haveFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // GC prologue and epilogue
a61af66fc99e Initial load
duke
parents:
diff changeset
878 void gc_prologue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
879 void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 jlong time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 if (_collectorState <= Idling) {
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // gc not in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
884 return _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // collection in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
887 return now;
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Support for parallel remark of survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
892 void* get_data_recorder(int thr_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 CMSBitMap* markBitMap() { return &_markBitMap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
895 void directAllocated(HeapWord* start, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // main CMS steps and related support
a61af66fc99e Initial load
duke
parents:
diff changeset
898 void checkpointRootsInitial(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
899 bool markFromRoots(bool asynch); // a return value of false indicates failure
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // due to stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
901 void preclean();
a61af66fc99e Initial load
duke
parents:
diff changeset
902 void checkpointRootsFinal(bool asynch, bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
903 bool init_mark_was_synchronous);
a61af66fc99e Initial load
duke
parents:
diff changeset
904 void sweep(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // Check that the currently executing thread is the expected
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // one (foreground collector or background collector).
a61af66fc99e Initial load
duke
parents:
diff changeset
908 void check_correct_thread_executing() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // XXXPERM void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911 bool is_cms_reachable(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Performance Counter Support
a61af66fc99e Initial load
duke
parents:
diff changeset
914 CollectorCounters* counters() { return _gc_counters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // timer stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
917 void startTimer() { assert(!_timer.is_active(), "Error"); _timer.start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
918 void stopTimer() { assert( _timer.is_active(), "Error"); _timer.stop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
919 void resetTimer() { assert(!_timer.is_active(), "Error"); _timer.reset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
920 double timerValue() { assert(!_timer.is_active(), "Error"); return _timer.seconds(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
921
a61af66fc99e Initial load
duke
parents:
diff changeset
922 int yields() { return _numYields; }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 void resetYields() { _numYields = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
924 void incrementYields() { _numYields++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 void resetNumDirtyCards() { _numDirtyCards = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
926 void incrementNumDirtyCards(size_t num) { _numDirtyCards += num; }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 size_t numDirtyCards() { return _numDirtyCards; }
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 static bool foregroundGCShouldWait() { return _foregroundGCShouldWait; }
a61af66fc99e Initial load
duke
parents:
diff changeset
930 static void set_foregroundGCShouldWait(bool v) { _foregroundGCShouldWait = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
931 static bool foregroundGCIsActive() { return _foregroundGCIsActive; }
a61af66fc99e Initial load
duke
parents:
diff changeset
932 static void set_foregroundGCIsActive(bool v) { _foregroundGCIsActive = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 uint sweepCount() const { return _sweepCount; }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 void incrementSweepCount() { _sweepCount++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 // Timers/stats for gc scheduling and incremental mode pacing.
a61af66fc99e Initial load
duke
parents:
diff changeset
937 CMSStats& stats() { return _stats; }
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Convenience methods that check whether CMSIncrementalMode is enabled and
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // forward to the corresponding methods in ConcurrentMarkSweepThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
941 static void start_icms();
a61af66fc99e Initial load
duke
parents:
diff changeset
942 static void stop_icms(); // Called at the end of the cms cycle.
a61af66fc99e Initial load
duke
parents:
diff changeset
943 static void disable_icms(); // Called before a foreground collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
944 static void enable_icms(); // Called after a foreground collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
945 void icms_wait(); // Called at yield points.
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // Adaptive size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
948 CMSAdaptiveSizePolicy* size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
949 CMSGCAdaptivePolicyCounters* gc_adaptive_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
952 void verify(bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
953 bool verify_after_remark();
a61af66fc99e Initial load
duke
parents:
diff changeset
954 void verify_ok_to_terminate() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
955 void verify_work_stacks_empty() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
956 void verify_overflow_empty() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
957
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // convenience methods in support of debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
959 static const size_t skip_header_HeapWords() PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
960 HeapWord* block_start(const void* p) const PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
961
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
963 CMSMarkStack* verification_mark_stack() { return &_markStack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
964 CMSBitMap* verification_mark_bm() { return &_verification_mark_bm; }
a61af66fc99e Initial load
duke
parents:
diff changeset
965
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // Get the bit map with a perm gen "deadness" information.
a61af66fc99e Initial load
duke
parents:
diff changeset
967 CMSBitMap* perm_gen_verify_bit_map() { return &_perm_gen_verify_bit_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
968
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // Initialization errors
a61af66fc99e Initial load
duke
parents:
diff changeset
970 bool completed_initialization() { return _completed_initialization; }
a61af66fc99e Initial load
duke
parents:
diff changeset
971 };
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 class CMSExpansionCause : public AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
974 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
975 enum Cause {
a61af66fc99e Initial load
duke
parents:
diff changeset
976 _no_expansion,
a61af66fc99e Initial load
duke
parents:
diff changeset
977 _satisfy_free_ratio,
a61af66fc99e Initial load
duke
parents:
diff changeset
978 _satisfy_promotion,
a61af66fc99e Initial load
duke
parents:
diff changeset
979 _satisfy_allocation,
a61af66fc99e Initial load
duke
parents:
diff changeset
980 _allocate_par_lab,
a61af66fc99e Initial load
duke
parents:
diff changeset
981 _allocate_par_spooling_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
982 _adaptive_size_policy
a61af66fc99e Initial load
duke
parents:
diff changeset
983 };
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // Return a string describing the cause of the expansion.
a61af66fc99e Initial load
duke
parents:
diff changeset
985 static const char* to_string(CMSExpansionCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
986 };
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 class ConcurrentMarkSweepGeneration: public CardGeneration {
a61af66fc99e Initial load
duke
parents:
diff changeset
989 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
990 friend class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
991 friend class ConcurrentMarkSweep;
a61af66fc99e Initial load
duke
parents:
diff changeset
992 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
993 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
994 static CMSCollector* _collector; // the collector that collects us
a61af66fc99e Initial load
duke
parents:
diff changeset
995 CompactibleFreeListSpace* _cmsSpace; // underlying space (only one for now)
a61af66fc99e Initial load
duke
parents:
diff changeset
996
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
998 GenerationCounters* _gen_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 GSpaceCounters* _space_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1000
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 // Words directly allocated, used by CMSStats.
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 size_t _direct_allocated_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 // Non-product stat counters
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 int _numObjectsPromoted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 int _numWordsPromoted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 int _numObjectsAllocated;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 int _numWordsAllocated;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 // Used for sizing decisions
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 bool _incremental_collection_failed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 bool incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 return _incremental_collection_failed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 void set_incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 _incremental_collection_failed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 void clear_incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 _incremental_collection_failed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1024 // accessors
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1025 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
1026 CMSExpansionCause::Cause expansion_cause() const { return _expansion_cause; }
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1027
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 // For parallel young-gen GC support.
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 CMSParGCThreadState** _par_gc_thread_states;
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 // Reason generation was expanded
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 CMSExpansionCause::Cause _expansion_cause;
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // In support of MinChunkSize being larger than min object size
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 const double _dilatation_factor;
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 enum CollectionTypes {
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 Concurrent_collection_type = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 MS_foreground_collection_type = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 MSC_foreground_collection_type = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 Unknown_collection_type = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 CollectionTypes _debug_collection_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1047 // 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
1048 // will collect this generation (at least).
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1049 double _initiating_occupancy;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1050
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // Shrink generation by specified size (returns false if unable to shrink)
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 virtual void shrink_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // Update statistics for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 virtual void update_gc_stats(int level, bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // Maximum available space in the generation (including uncommitted)
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 // space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 size_t max_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1062 // getter and initializer for _initiating_occupancy field.
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1063 double initiating_occupancy() const { return _initiating_occupancy; }
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1064 void init_initiating_occupancy(intx io, intx tr);
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1065
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 ConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 int level, CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 bool use_adaptive_freelists,
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 FreeBlockDictionary::DictionaryChoice);
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 CMSCollector* collector() const { return _collector; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 static void set_collector(CMSCollector* collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 assert(_collector == NULL, "already set");
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 _collector = collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 CompactibleFreeListSpace* cmsSpace() const { return _cmsSpace; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1079
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 Mutex* freelistLock() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 virtual Generation::Name kind() { return Generation::ConcurrentMarkSweep; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // Adaptive size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 CMSAdaptiveSizePolicy* size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 bool refs_discovery_is_atomic() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 bool refs_discovery_is_mt() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // Note: CMS does MT-discovery during the parallel-remark
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // phases. Use ReferenceProcessorMTMutator to make refs
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // discovery MT-safe during such phases or other parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // discovery phases in the future. This may all go away
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // if/when we decide that refs discovery is sufficiently
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // rare that the cost of the CAS's involved is in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // noise. That's a measurement that should be done, and
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // the code simplified if that turns out to be the case.
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // Override
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 virtual void ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
1102
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1103 // 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
1104 bool grow_by(size_t bytes);
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1105 // Grow generation to reserved size.
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1106 bool grow_to_reserved();
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1107
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 void clear_expansion_cause() { _expansion_cause = CMSExpansionCause::_no_expansion; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1109
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // Space enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 size_t capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 size_t used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 size_t free() const;
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1114 double occupancy() const { return ((double)used())/((double)capacity()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 size_t contiguous_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 size_t unsafe_max_alloc_nogc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // over-rides
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 MemRegion used_region() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 MemRegion used_region_at_save_marks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 // Does a "full" (forced) collection invoked on this generation collect
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // all younger generations as well? Note that the second conjunct is a
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 // hack to allow the collection of the younger gen first if the flag is
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // set. This is better than using th policy's should_collect_gen0_first()
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // since that causes us to do an extra unnecessary pair of restart-&-stop-world.
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 virtual bool full_collects_younger_generations() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 return UseCMSCompactAtFullCollection && !CollectGen0First;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 void space_iterate(SpaceClosure* blk, bool usedOnly = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1132
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // Support for compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 CompactibleSpace* first_compaction_space() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // Adjust quantites in the generation affected by
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // the compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 void reset_after_compaction();
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // Allocation support
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 HeapWord* allocate(size_t size, bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 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
1142 oop promote(oop obj, size_t obj_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 HeapWord* par_allocate(size_t size, bool tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 return allocate(size, tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1146
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 // Incremental mode triggering.
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // Used by CMSStats to track direct allocation. The value is sampled and
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // reset after each young gen collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 size_t direct_allocated_words() const { return _direct_allocated_words; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 void reset_direct_allocated_words() { _direct_allocated_words = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // Overrides for parallel promotion.
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 virtual oop par_promote(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 oop obj, markOop m, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 // This one should not be called for CMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 virtual void par_promote_alloc_undo(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 HeapWord* obj, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 virtual void par_promote_alloc_done(int thread_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 virtual void par_oop_since_save_marks_iterate_done(int thread_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1164
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 virtual bool promotion_attempt_is_safe(size_t promotion_in_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 bool younger_handles_promotion_failure) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 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
1169 virtual bool should_concurrent_collect() const;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1170 virtual bool is_too_full() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 HeapWord* expand_and_allocate(size_t word_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 bool tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 bool parallel = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // GC prologue and epilogue
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 void gc_prologue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 void gc_prologue_work(bool full, bool registerClosure,
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 ModUnionClosure* modUnionClosure);
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 void gc_epilogue_work(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // Time since last GC of this generation
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 jlong time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 return collector()->time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 collector()-> update_time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // Allocation failure
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 void expand(size_t bytes, size_t expand_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 CMSExpansionCause::Cause cause);
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1198 virtual bool expand(size_t bytes, size_t expand_bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 void shrink(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 HeapWord* expand_and_par_lab_allocate(CMSParGCThreadState* ps, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 bool expand_and_ensure_spooling_space(PromotionInfo* promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1202
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 // Iteration support and related enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 void save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 bool no_allocs_since_save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 void object_iterate_since_last_GC(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 void younger_refs_iterate(OopsInGenClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1208
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 // Iteration support specific to CMS generations
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 void save_sweep_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // More iteration support
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 virtual void oop_iterate(MemRegion mr, OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 virtual void oop_iterate(OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 virtual void object_iterate(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // Need to declare the full complement of closures, whether we'll
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // override them or not, or get message from the compiler:
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // oop_since_save_marks_iterate_nv hides virtual function...
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 #define CMS_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 ALL_SINCE_SAVE_MARKS_CLOSURES(CMS_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // Smart allocation XXX -- move to CFLSpace?
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 void setNearLargestChunk();
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 bool isNearLargestChunk(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // Get the chunk at the end of the space. Delagates to
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 FreeChunk* find_chunk_at_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
1231
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // Overriding of unused functionality (sharing not yet supported with CMS)
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 void pre_adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 void post_compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
1235
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 void prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 void verify(bool allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1240
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 // Performance Counters support
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 virtual void update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 virtual void update_counters(size_t used);
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 void initialize_performance_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 CollectorCounters* counters() { return collector()->counters(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // Support for parallel remark of survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 void* get_data_recorder(int thr_num) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 //Delegate to collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 return collector()->get_data_recorder(thr_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 const char* name() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 virtual const char* short_name() const { return "CMS"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 void printOccupancy(const char* s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 bool must_be_youngest() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 bool must_be_oldest() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1260
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 void compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 CollectionTypes debug_collection_type() { return _debug_collection_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 void rotate_debug_collection_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1266
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 class ASConcurrentMarkSweepGeneration : public ConcurrentMarkSweepGeneration {
a61af66fc99e Initial load
duke
parents:
diff changeset
1268
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 // Return the size policy from the heap's collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 // policy casted to CMSAdaptiveSizePolicy*.
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 CMSAdaptiveSizePolicy* cms_size_policy() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1272
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // Resize the generation based on the adaptive size
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 // policy.
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 void resize(size_t cur_promo, size_t desired_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 // Return the GC counters from the collector policy
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 CMSGCAdaptivePolicyCounters* gc_adaptive_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 virtual void shrink_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 virtual void compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 ASConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 int level, CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 bool use_adaptive_freelists,
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 FreeBlockDictionary::DictionaryChoice
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 dictionaryChoice) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 ConcurrentMarkSweepGeneration(rs, initial_byte_size, level, ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 use_adaptive_freelists, dictionaryChoice) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 virtual const char* short_name() const { return "ASCMS"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 virtual Generation::Name kind() { return Generation::ASConcurrentMarkSweep; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 virtual void update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 virtual void update_counters(size_t used);
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1298
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 // Closures of various sorts used by CMS to accomplish its work
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1302
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 // This closure is used to check that a certain set of oops is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 class FalseClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1306 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
1307 void do_oop(narrowOop* p) { guarantee(false, "Should be an empty set"); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 // This closure is used to do concurrent marking from the roots
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 // following the first checkpoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 class MarkFromRootsClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 CMSBitMap* _bitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 CMSBitMap* _mut;
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 CMSMarkStack* _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 CMSMarkStack* _revisitStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 int _skipBits;
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 HeapWord* _threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 DEBUG_ONLY(bool _verifying;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1324
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 MarkFromRootsClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 CMSBitMap* bitMap,
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 CMSMarkStack* markStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 CMSMarkStack* revisitStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 bool should_yield, bool verifying = false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1331 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 void reset(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1334
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 void scanOopsInOop(HeapWord* ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1339
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 // This closure is used to do concurrent multi-threaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 // marking from the roots following the first checkpoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 // XXX This should really be a subclass of The serial version
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 // above, but i have not had the time to refactor things cleanly.
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 // That willbe done for Dolphin.
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 class Par_MarkFromRootsClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 MemRegion _whole_span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 CMSBitMap* _mut;
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 CMSMarkStack* _overflow_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 CMSMarkStack* _revisit_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 int _skip_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 HeapWord* _threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 CMSConcMarkingTask* _task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 Par_MarkFromRootsClosure(CMSConcMarkingTask* task, CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 CMSMarkStack* overflow_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 bool should_yield);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1367 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 void scan_oops_in_oop(HeapWord* ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 bool get_work_from_overflow_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1375
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 // The following closures are used to do certain kinds of verification of
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 // CMS marking.
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 class PushAndMarkVerifyClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 CMSBitMap* _verification_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 CMSBitMap* _cms_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 CMSMarkStack* _mark_stack;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1384 protected:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1385 void do_oop(oop p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1386 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
1387 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
1388 do_oop(obj);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1389 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 PushAndMarkVerifyClosure(CMSCollector* cms_collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 CMSBitMap* verification_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 CMSBitMap* cms_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 CMSMarkStack* mark_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 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
1397 void do_oop(narrowOop* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 // Deal with a stack overflow condition
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 void handle_stack_overflow(HeapWord* lost);
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1401
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 class MarkFromRootsVerifyClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 CMSBitMap* _verification_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 CMSBitMap* _cms_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 PushAndMarkVerifyClosure _pam_verify_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 MarkFromRootsVerifyClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 CMSBitMap* verification_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 CMSBitMap* cms_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 CMSMarkStack* mark_stack);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1415 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 void reset(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1418
a61af66fc99e Initial load
duke
parents:
diff changeset
1419
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // This closure is used to check that a certain set of bits is
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 // "empty" (i.e. the bit vector doesn't have any 1-bits).
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 class FalseBitMapClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 public:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1424 bool do_bit(size_t offset) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 guarantee(false, "Should not have a 1 bit");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1426 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 // This closure is used during the second checkpointing phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 // to rescan the marked objects on the dirty cards in the mod
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 // union table and the card table proper. It's invoked via
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 // MarkFromDirtyCardsClosure below. It uses either
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 // [Par_]MarkRefsIntoAndScanClosure (Par_ in the parallel case)
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // declared in genOopClosures.hpp to accomplish some of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 // In the parallel case the bitMap is shared, so access to
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 // it needs to be suitably synchronized for updates by embedded
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 // closures that update it; however, this closure itself only
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // reads the bit_map and because it is idempotent, is immune to
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 // reading stale values.
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 class ScanMarkedObjectsAgainClosure: public UpwardsObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 union {
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 bool _parallel;
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 union {
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 MarkRefsIntoAndScanClosure* _scan_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 Par_MarkRefsIntoAndScanClosure* _par_scan_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1456
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 ScanMarkedObjectsAgainClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 _mark_stack(mark_stack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 _parallel(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 _scan_closure(cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1473
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 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 Par_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 _work_queue(work_queue),
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 _parallel(true),
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 _par_scan_closure(cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1489
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 guarantee(false, "Call do_object_b(oop, MemRegion) instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 bool do_object_b(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 guarantee(false, "Call do_object_b(oop, MemRegion) form instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 bool do_object_bm(oop p, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1499
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 // This closure is used during the second checkpointing phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 // to rescan the marked objects on the dirty cards in the mod
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // union table and the card table proper. It invokes
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 // ScanMarkedObjectsAgainClosure above to accomplish much of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 // In the parallel case, the bit map is shared and requires
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 // synchronized access.
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 class MarkFromDirtyCardsClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 CompactibleFreeListSpace* _space;
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 ScanMarkedObjectsAgainClosure _scan_cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 size_t _num_dirty_cards;
a61af66fc99e Initial load
duke
parents:
diff changeset
1510
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 MarkFromDirtyCardsClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 CompactibleFreeListSpace* space,
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 _space(space),
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 _num_dirty_cards(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 _scan_cl(collector, span, collector->ref_processor(), bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 mark_stack, revisit_stack, cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1523
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 MarkFromDirtyCardsClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 CompactibleFreeListSpace* space,
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 CMSMarkStack* revisit_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 Par_MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 _space(space),
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 _num_dirty_cards(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 _scan_cl(collector, span, collector->ref_processor(), bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 work_queue, revisit_stack, cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1535
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 void set_space(CompactibleFreeListSpace* space) { _space = space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 size_t num_dirty_cards() { return _num_dirty_cards; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 // This closure is used in the non-product build to check
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 // that there are no MemRegions with a certain property.
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 class FalseMemRegionClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 void do_MemRegion(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 guarantee(!mr.is_empty(), "Shouldn't be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 guarantee(false, "Should never be here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1549
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 // This closure is used during the precleaning phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 // to "carefully" rescan marked objects on dirty cards.
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 // It uses MarkRefsIntoAndScanClosure declared in genOopClosures.hpp
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 // to accomplish some of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 class ScanMarkedObjectsAgainCarefullyClosure: public ObjectClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 Mutex* _freelistLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 CMSBitMap* _bitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 CMSMarkStack* _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 MarkRefsIntoAndScanClosure* _scanningClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1562
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 ScanMarkedObjectsAgainCarefullyClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 CMSBitMap* bitMap,
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 CMSMarkStack* markStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 CMSMarkStack* revisitStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 MarkRefsIntoAndScanClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 bool should_yield):
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 _yield(should_yield),
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 _bitMap(bitMap),
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 _markStack(markStack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 _scanningClosure(cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1578
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 void do_object(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 guarantee(false, "call do_object_careful instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1582
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 size_t do_object_careful(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 guarantee(false, "Unexpected caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1587
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 size_t do_object_careful_m(oop p, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1589
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 void setFreelistLock(Mutex* m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 _freelistLock = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 _scanningClosure->set_freelistLock(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 inline bool do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1597
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1600
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 class SurvivorSpacePrecleanClosure: public ObjectClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 PushAndMarkClosure* _scanning_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 unsigned int _before_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1609
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 SurvivorSpacePrecleanClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 PushAndMarkClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 unsigned int before_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 bool should_yield):
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 _yield(should_yield),
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 _mark_stack(mark_stack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 _scanning_closure(cl),
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 _before_count(before_count)
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1626
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 void do_object(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 guarantee(false, "call do_object_careful instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1630
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 size_t do_object_careful(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
1632
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 size_t do_object_careful_m(oop p, MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 guarantee(false, "Unexpected caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1637
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1642
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 // This closure is used to accomplish the sweeping work
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 // after the second checkpoint but before the concurrent reset
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 // phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 // Terminology
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 // left hand chunk (LHC) - block of one or more chunks currently being
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 // coalesced. The LHC is available for coalescing with a new chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 // right hand chunk (RHC) - block that is currently being swept that is
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 // free or garbage that can be coalesced with the LHC.
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 // _inFreeRange is true if there is currently a LHC
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 // _lastFreeRangeCoalesced is true if the LHC consists of more than one chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 // _freeRangeInFreeLists is true if the LHC is in the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 // _freeFinger is the address of the current LHC
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 class SweepClosure: public BlkClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 CMSCollector* _collector; // collector doing the work
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 ConcurrentMarkSweepGeneration* _g; // Generation being swept
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 CompactibleFreeListSpace* _sp; // Space being swept
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 HeapWord* _limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 Mutex* _freelistLock; // Free list lock (in space)
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 CMSBitMap* _bitMap; // Marking bit map (in
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 // generation)
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 bool _inFreeRange; // Indicates if we are in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 // midst of a free run
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 bool _freeRangeInFreeLists;
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 // Often, we have just found
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 // a free chunk and started
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 // a new free range; we do not
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 // eagerly remove this chunk from
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 // the free lists unless there is
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 // a possibility of coalescing.
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 // When true, this flag indicates
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 // that the _freeFinger below
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 // points to a potentially free chunk
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 // that may still be in the free lists
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 bool _lastFreeRangeCoalesced;
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 // free range contains chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 // coalesced
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 // Whether sweeping should be
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 // done with yields. For instance
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 // when done by the foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 // collector we shouldn't yield.
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 HeapWord* _freeFinger; // When _inFreeRange is set, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 // pointer to the "left hand
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 // chunk"
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 size_t _freeRangeSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 // When _inFreeRange is set, this
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 // indicates the accumulated size
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 // of the "left hand chunk"
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 size_t _numObjectsFreed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 size_t _numWordsFreed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 size_t _numObjectsLive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 size_t _numWordsLive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 size_t _numObjectsAlreadyFree;
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 size_t _numWordsAlreadyFree;
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 FreeChunk* _last_fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 // Code that is common to a free chunk or garbage when
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 // encountered during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 void doPostIsFreeOrGarbageChunk(FreeChunk *fc,
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 size_t chunkSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 // Process a free chunk during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 void doAlreadyFreeChunk(FreeChunk *fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 // Process a garbage chunk during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 size_t doGarbageChunk(FreeChunk *fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 // Process a live chunk during sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 size_t doLiveChunk(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1712
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 HeapWord* freeFinger() const { return _freeFinger; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 void set_freeFinger(HeapWord* v) { _freeFinger = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 size_t freeRangeSize() const { return _freeRangeSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 void set_freeRangeSize(size_t v) { _freeRangeSize = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 bool inFreeRange() const { return _inFreeRange; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 void set_inFreeRange(bool v) { _inFreeRange = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 bool lastFreeRangeCoalesced() const { return _lastFreeRangeCoalesced; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 void set_lastFreeRangeCoalesced(bool v) { _lastFreeRangeCoalesced = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 bool freeRangeInFreeLists() const { return _freeRangeInFreeLists; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 void set_freeRangeInFreeLists(bool v) { _freeRangeInFreeLists = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1724
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 // Initialize a free range.
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 void initialize_free_range(HeapWord* freeFinger, bool freeRangeInFreeLists);
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 // Return this chunk to the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 void flushCurFreeChunk(HeapWord* chunk, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1729
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 // Check if we should yield and do so when necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 inline void do_yield_check(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1732
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 // Yield
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 void do_yield_work(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1735
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 // Debugging/Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 void record_free_block_coalesced(FreeChunk* fc) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1738
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 SweepClosure(CMSCollector* collector, ConcurrentMarkSweepGeneration* g,
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 CMSBitMap* bitMap, bool should_yield);
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 ~SweepClosure();
a61af66fc99e Initial load
duke
parents:
diff changeset
1743
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 size_t do_blk_careful(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1746
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 // Closures related to weak references processing
a61af66fc99e Initial load
duke
parents:
diff changeset
1748
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 // During CMS' weak reference processing, this is a
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 // work-routine/closure used to complete transitive
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 // marking of objects as live after a certain point
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 // 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
1753 // 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
1754 // 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
1755 // precleaning of the discovered reference lists.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 class CMSDrainMarkingStackClosure: public VoidClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 CMSKeepAliveClosure* _keep_alive;
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1762 bool _concurrent_precleaning;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 CMSDrainMarkingStackClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1766 CMSKeepAliveClosure* keep_alive,
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1767 bool cpc):
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 _mark_stack(mark_stack),
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1772 _keep_alive(keep_alive),
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1773 _concurrent_precleaning(cpc) {
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1774 assert(_concurrent_precleaning == _keep_alive->concurrent_precleaning(),
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1775 "Mismatch");
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1776 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1777
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 void do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1780
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 // A parallel version of CMSDrainMarkingStackClosure above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 class CMSParDrainMarkingStackClosure: public VoidClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 CMSInnerParMarkAndPushClosure _mark_and_push;
a61af66fc99e Initial load
duke
parents:
diff changeset
1788
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 CMSParDrainMarkingStackClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 MemRegion span, CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 OopTaskQueue* work_queue):
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 _work_queue(work_queue),
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 _mark_and_push(collector, span, bit_map, work_queue) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1798
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 void trim_queue(uint max);
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 void do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1803
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 // Allow yielding or short-circuiting of reference list
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 // prelceaning work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 class CMSPrecleanRefsYieldClosure: public YieldClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 CMSPrecleanRefsYieldClosure(CMSCollector* collector):
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 _collector(collector) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 virtual bool should_return();
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1814
a61af66fc99e Initial load
duke
parents:
diff changeset
1815
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 // Convenience class that locks free list locks for given CMS collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 class FreelistLocker: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 FreelistLocker(CMSCollector* collector):
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 _collector(collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 _collector->getFreelistLocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1825
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 ~FreelistLocker() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 _collector->releaseFreelistLocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1830
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 // Mark all dead objects in a given space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 class MarkDeadObjectsClosure: public BlkClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 const CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 const CompactibleFreeListSpace* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 CMSBitMap* _live_bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 CMSBitMap* _dead_bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 MarkDeadObjectsClosure(const CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 const CompactibleFreeListSpace* sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 CMSBitMap *live_bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 CMSBitMap *dead_bit_map) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 _sp(sp),
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 _live_bit_map(live_bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 _dead_bit_map(dead_bit_map) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 size_t do_blk(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 };