annotate src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @ 1951:899bbbdcb6ea

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