Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/g1/concurrentMark.hpp @ 4837:eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
Summary: Re-enable survivors during the initial-mark pause. Afterwards, the concurrent marking threads have to scan them and mark everything reachable from them. The next GC will have to wait for the survivors to be scanned.
Reviewed-by: brutisso, johnc
author | tonyp |
---|---|
date | Wed, 25 Jan 2012 12:58:23 -0500 |
parents | d30fa85f9994 |
children | 2a0172480595 |
rev | line source |
---|---|
342 | 1 /* |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. |
342 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1394
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1394
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:
1394
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP | |
27 | |
2152 | 28 #include "gc_implementation/g1/heapRegionSets.hpp" |
1972 | 29 #include "utilities/taskqueue.hpp" |
30 | |
342 | 31 class G1CollectedHeap; |
32 class CMTask; | |
1311
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1044
diff
changeset
|
33 typedef GenericTaskQueue<oop> CMTaskQueue; |
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1044
diff
changeset
|
34 typedef GenericTaskQueueSet<CMTaskQueue> CMTaskQueueSet; |
342 | 35 |
2037
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
36 // Closure used by CM during concurrent reference discovery |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
37 // and reference processing (during remarking) to determine |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
38 // if a particular object is alive. It is primarily used |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
39 // to determine if referents of discovered reference objects |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
40 // are alive. An instance is also embedded into the |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
41 // reference processor as the _is_alive_non_header field |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
42 class G1CMIsAliveClosure: public BoolObjectClosure { |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
43 G1CollectedHeap* _g1; |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
44 public: |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
45 G1CMIsAliveClosure(G1CollectedHeap* g1) : |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
46 _g1(g1) |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
47 {} |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
48 |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
49 void do_object(oop obj) { |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
50 ShouldNotCallThis(); |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
51 } |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
52 bool do_object_b(oop obj); |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
53 }; |
b03260081e9b
7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents:
1972
diff
changeset
|
54 |
342 | 55 // A generic CM bit map. This is essentially a wrapper around the BitMap |
56 // class, with one bit per (1<<_shifter) HeapWords. | |
57 | |
549
fe3d7c11b4b7
6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents:
342
diff
changeset
|
58 class CMBitMapRO VALUE_OBJ_CLASS_SPEC { |
342 | 59 protected: |
60 HeapWord* _bmStartWord; // base address of range covered by map | |
61 size_t _bmWordSize; // map size (in #HeapWords covered) | |
62 const int _shifter; // map to char or bit | |
63 VirtualSpace _virtual_space; // underlying the bit map | |
64 BitMap _bm; // the bit map itself | |
65 | |
66 public: | |
67 // constructor | |
68 CMBitMapRO(ReservedSpace rs, int shifter); | |
69 | |
70 enum { do_yield = true }; | |
71 | |
72 // inquiries | |
73 HeapWord* startWord() const { return _bmStartWord; } | |
74 size_t sizeInWords() const { return _bmWordSize; } | |
75 // the following is one past the last word in space | |
76 HeapWord* endWord() const { return _bmStartWord + _bmWordSize; } | |
77 | |
78 // read marks | |
79 | |
80 bool isMarked(HeapWord* addr) const { | |
81 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize), | |
82 "outside underlying space?"); | |
83 return _bm.at(heapWordToOffset(addr)); | |
84 } | |
85 | |
86 // iteration | |
4827
2e966d967c5c
7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents:
4787
diff
changeset
|
87 inline bool iterate(BitMapClosure* cl, MemRegion mr); |
2e966d967c5c
7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents:
4787
diff
changeset
|
88 inline bool iterate(BitMapClosure* cl); |
342 | 89 |
90 // Return the address corresponding to the next marked bit at or after | |
91 // "addr", and before "limit", if "limit" is non-NULL. If there is no | |
92 // such bit, returns "limit" if that is non-NULL, or else "endWord()". | |
93 HeapWord* getNextMarkedWordAddress(HeapWord* addr, | |
94 HeapWord* limit = NULL) const; | |
95 // Return the address corresponding to the next unmarked bit at or after | |
96 // "addr", and before "limit", if "limit" is non-NULL. If there is no | |
97 // such bit, returns "limit" if that is non-NULL, or else "endWord()". | |
98 HeapWord* getNextUnmarkedWordAddress(HeapWord* addr, | |
99 HeapWord* limit = NULL) const; | |
100 | |
101 // conversion utilities | |
102 // XXX Fix these so that offsets are size_t's... | |
103 HeapWord* offsetToHeapWord(size_t offset) const { | |
104 return _bmStartWord + (offset << _shifter); | |
105 } | |
106 size_t heapWordToOffset(HeapWord* addr) const { | |
107 return pointer_delta(addr, _bmStartWord) >> _shifter; | |
108 } | |
109 int heapWordDiffToOffsetDiff(size_t diff) const; | |
110 HeapWord* nextWord(HeapWord* addr) { | |
111 return offsetToHeapWord(heapWordToOffset(addr) + 1); | |
112 } | |
113 | |
114 void mostly_disjoint_range_union(BitMap* from_bitmap, | |
115 size_t from_start_index, | |
116 HeapWord* to_start_word, | |
117 size_t word_num); | |
118 | |
119 // debugging | |
120 NOT_PRODUCT(bool covers(ReservedSpace rs) const;) | |
121 }; | |
122 | |
123 class CMBitMap : public CMBitMapRO { | |
124 | |
125 public: | |
126 // constructor | |
127 CMBitMap(ReservedSpace rs, int shifter) : | |
128 CMBitMapRO(rs, shifter) {} | |
129 | |
130 // write marks | |
131 void mark(HeapWord* addr) { | |
132 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize), | |
133 "outside underlying space?"); | |
3771 | 134 _bm.set_bit(heapWordToOffset(addr)); |
342 | 135 } |
136 void clear(HeapWord* addr) { | |
137 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize), | |
138 "outside underlying space?"); | |
3771 | 139 _bm.clear_bit(heapWordToOffset(addr)); |
342 | 140 } |
141 bool parMark(HeapWord* addr) { | |
142 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize), | |
143 "outside underlying space?"); | |
3771 | 144 return _bm.par_set_bit(heapWordToOffset(addr)); |
342 | 145 } |
146 bool parClear(HeapWord* addr) { | |
147 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize), | |
148 "outside underlying space?"); | |
3771 | 149 return _bm.par_clear_bit(heapWordToOffset(addr)); |
342 | 150 } |
151 void markRange(MemRegion mr); | |
152 void clearAll(); | |
153 void clearRange(MemRegion mr); | |
154 | |
155 // Starting at the bit corresponding to "addr" (inclusive), find the next | |
156 // "1" bit, if any. This bit starts some run of consecutive "1"'s; find | |
157 // the end of this run (stopping at "end_addr"). Return the MemRegion | |
158 // covering from the start of the region corresponding to the first bit | |
159 // of the run to the end of the region corresponding to the last bit of | |
160 // the run. If there is no "1" bit at or after "addr", return an empty | |
161 // MemRegion. | |
162 MemRegion getAndClearMarkedRegion(HeapWord* addr, HeapWord* end_addr); | |
163 }; | |
164 | |
165 // Represents a marking stack used by the CM collector. | |
166 // Ideally this should be GrowableArray<> just like MSC's marking stack(s). | |
549
fe3d7c11b4b7
6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents:
342
diff
changeset
|
167 class CMMarkStack VALUE_OBJ_CLASS_SPEC { |
342 | 168 ConcurrentMark* _cm; |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
169 oop* _base; // bottom of stack |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
170 jint _index; // one more than last occupied index |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
171 jint _capacity; // max #elements |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
172 jint _saved_index; // value of _index saved at start of GC |
342 | 173 NOT_PRODUCT(jint _max_depth;) // max depth plumbed during run |
174 | |
175 bool _overflow; | |
176 DEBUG_ONLY(bool _drain_in_progress;) | |
177 DEBUG_ONLY(bool _drain_in_progress_yields;) | |
178 | |
179 public: | |
180 CMMarkStack(ConcurrentMark* cm); | |
181 ~CMMarkStack(); | |
182 | |
183 void allocate(size_t size); | |
184 | |
185 oop pop() { | |
186 if (!isEmpty()) { | |
187 return _base[--_index] ; | |
188 } | |
189 return NULL; | |
190 } | |
191 | |
192 // If overflow happens, don't do the push, and record the overflow. | |
193 // *Requires* that "ptr" is already marked. | |
194 void push(oop ptr) { | |
195 if (isFull()) { | |
196 // Record overflow. | |
197 _overflow = true; | |
198 return; | |
199 } else { | |
200 _base[_index++] = ptr; | |
201 NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index)); | |
202 } | |
203 } | |
204 // Non-block impl. Note: concurrency is allowed only with other | |
205 // "par_push" operations, not with "pop" or "drain". We would need | |
206 // parallel versions of them if such concurrency was desired. | |
207 void par_push(oop ptr); | |
208 | |
209 // Pushes the first "n" elements of "ptr_arr" on the stack. | |
210 // Non-block impl. Note: concurrency is allowed only with other | |
211 // "par_adjoin_arr" or "push" operations, not with "pop" or "drain". | |
212 void par_adjoin_arr(oop* ptr_arr, int n); | |
213 | |
214 // Pushes the first "n" elements of "ptr_arr" on the stack. | |
215 // Locking impl: concurrency is allowed only with | |
216 // "par_push_arr" and/or "par_pop_arr" operations, which use the same | |
217 // locking strategy. | |
218 void par_push_arr(oop* ptr_arr, int n); | |
219 | |
220 // If returns false, the array was empty. Otherwise, removes up to "max" | |
221 // elements from the stack, and transfers them to "ptr_arr" in an | |
222 // unspecified order. The actual number transferred is given in "n" ("n | |
223 // == 0" is deliberately redundant with the return value.) Locking impl: | |
224 // concurrency is allowed only with "par_push_arr" and/or "par_pop_arr" | |
225 // operations, which use the same locking strategy. | |
226 bool par_pop_arr(oop* ptr_arr, int max, int* n); | |
227 | |
228 // Drain the mark stack, applying the given closure to all fields of | |
229 // objects on the stack. (That is, continue until the stack is empty, | |
230 // even if closure applications add entries to the stack.) The "bm" | |
231 // argument, if non-null, may be used to verify that only marked objects | |
232 // are on the mark stack. If "yield_after" is "true", then the | |
233 // concurrent marker performing the drain offers to yield after | |
234 // processing each object. If a yield occurs, stops the drain operation | |
235 // and returns false. Otherwise, returns true. | |
236 template<class OopClosureClass> | |
237 bool drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after = false); | |
238 | |
239 bool isEmpty() { return _index == 0; } | |
240 bool isFull() { return _index == _capacity; } | |
241 int maxElems() { return _capacity; } | |
242 | |
243 bool overflow() { return _overflow; } | |
244 void clear_overflow() { _overflow = false; } | |
245 | |
246 int size() { return _index; } | |
247 | |
248 void setEmpty() { _index = 0; clear_overflow(); } | |
249 | |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
250 // Record the current index. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
251 void note_start_of_gc(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
252 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
253 // Make sure that we have not added any entries to the stack during GC. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
254 void note_end_of_gc(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
255 |
342 | 256 // iterate over the oops in the mark stack, up to the bound recorded via |
257 // the call above. | |
258 void oops_do(OopClosure* f); | |
259 }; | |
260 | |
549
fe3d7c11b4b7
6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents:
342
diff
changeset
|
261 class CMRegionStack VALUE_OBJ_CLASS_SPEC { |
342 | 262 MemRegion* _base; |
263 jint _capacity; | |
264 jint _index; | |
265 jint _oops_do_bound; | |
266 bool _overflow; | |
267 public: | |
268 CMRegionStack(); | |
269 ~CMRegionStack(); | |
270 void allocate(size_t size); | |
271 | |
272 // This is lock-free; assumes that it will only be called in parallel | |
273 // with other "push" operations (no pops). | |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
274 void push_lock_free(MemRegion mr); |
1358
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
275 |
342 | 276 // Lock-free; assumes that it will only be called in parallel |
277 // with other "pop" operations (no pushes). | |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
278 MemRegion pop_lock_free(); |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
279 |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
280 #if 0 |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
281 // The routines that manipulate the region stack with a lock are |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
282 // not currently used. They should be retained, however, as a |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
283 // diagnostic aid. |
1358
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
284 |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
285 // These two are the implementations that use a lock. They can be |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
286 // called concurrently with each other but they should not be called |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
287 // concurrently with the lock-free versions (push() / pop()). |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
288 void push_with_lock(MemRegion mr); |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
289 MemRegion pop_with_lock(); |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
290 #endif |
342 | 291 |
292 bool isEmpty() { return _index == 0; } | |
293 bool isFull() { return _index == _capacity; } | |
294 | |
295 bool overflow() { return _overflow; } | |
296 void clear_overflow() { _overflow = false; } | |
297 | |
298 int size() { return _index; } | |
299 | |
300 // It iterates over the entries in the region stack and it | |
301 // invalidates (i.e. assigns MemRegion()) the ones that point to | |
302 // regions in the collection set. | |
303 bool invalidate_entries_into_cset(); | |
304 | |
305 // This gives an upper bound up to which the iteration in | |
306 // invalidate_entries_into_cset() will reach. This prevents | |
307 // newly-added entries to be unnecessarily scanned. | |
308 void set_oops_do_bound() { | |
309 _oops_do_bound = _index; | |
310 } | |
311 | |
312 void setEmpty() { _index = 0; clear_overflow(); } | |
313 }; | |
314 | |
3316
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
315 class ForceOverflowSettings VALUE_OBJ_CLASS_SPEC { |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
316 private: |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
317 #ifndef PRODUCT |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
318 uintx _num_remaining; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
319 bool _force; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
320 #endif // !defined(PRODUCT) |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
321 |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
322 public: |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
323 void init() PRODUCT_RETURN; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
324 void update() PRODUCT_RETURN; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
325 bool should_force() PRODUCT_RETURN_( return false; ); |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
326 }; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
327 |
342 | 328 // this will enable a variety of different statistics per GC task |
329 #define _MARKING_STATS_ 0 | |
330 // this will enable the higher verbose levels | |
331 #define _MARKING_VERBOSE_ 0 | |
332 | |
333 #if _MARKING_STATS_ | |
334 #define statsOnly(statement) \ | |
335 do { \ | |
336 statement ; \ | |
337 } while (0) | |
338 #else // _MARKING_STATS_ | |
339 #define statsOnly(statement) \ | |
340 do { \ | |
341 } while (0) | |
342 #endif // _MARKING_STATS_ | |
343 | |
344 typedef enum { | |
345 no_verbose = 0, // verbose turned off | |
346 stats_verbose, // only prints stats at the end of marking | |
347 low_verbose, // low verbose, mostly per region and per major event | |
348 medium_verbose, // a bit more detailed than low | |
349 high_verbose // per object verbose | |
350 } CMVerboseLevel; | |
351 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
352 class YoungList; |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
353 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
354 // Root Regions are regions that are not empty at the beginning of a |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
355 // marking cycle and which we might collect during an evacuation pause |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
356 // while the cycle is active. Given that, during evacuation pauses, we |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
357 // do not copy objects that are explicitly marked, what we have to do |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
358 // for the root regions is to scan them and mark all objects reachable |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
359 // from them. According to the SATB assumptions, we only need to visit |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
360 // each object once during marking. So, as long as we finish this scan |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
361 // before the next evacuation pause, we can copy the objects from the |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
362 // root regions without having to mark them or do anything else to them. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
363 // |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
364 // Currently, we only support root region scanning once (at the start |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
365 // of the marking cycle) and the root regions are all the survivor |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
366 // regions populated during the initial-mark pause. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
367 class CMRootRegions VALUE_OBJ_CLASS_SPEC { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
368 private: |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
369 YoungList* _young_list; |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
370 ConcurrentMark* _cm; |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
371 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
372 volatile bool _scan_in_progress; |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
373 volatile bool _should_abort; |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
374 HeapRegion* volatile _next_survivor; |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
375 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
376 public: |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
377 CMRootRegions(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
378 // We actually do most of the initialization in this method. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
379 void init(G1CollectedHeap* g1h, ConcurrentMark* cm); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
380 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
381 // Reset the claiming / scanning of the root regions. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
382 void prepare_for_scan(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
383 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
384 // Forces get_next() to return NULL so that the iteration aborts early. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
385 void abort() { _should_abort = true; } |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
386 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
387 // Return true if the CM thread are actively scanning root regions, |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
388 // false otherwise. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
389 bool scan_in_progress() { return _scan_in_progress; } |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
390 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
391 // Claim the next root region to scan atomically, or return NULL if |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
392 // all have been claimed. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
393 HeapRegion* claim_next(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
394 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
395 // Flag that we're done with root region scanning and notify anyone |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
396 // who's waiting on it. If aborted is false, assume that all regions |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
397 // have been claimed. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
398 void scan_finished(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
399 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
400 // If CM threads are still scanning root regions, wait until they |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
401 // are done. Return true if we had to wait, false otherwise. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
402 bool wait_until_scan_finished(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
403 }; |
342 | 404 |
405 class ConcurrentMarkThread; | |
406 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
407 class ConcurrentMark : public CHeapObj { |
342 | 408 friend class ConcurrentMarkThread; |
409 friend class CMTask; | |
410 friend class CMBitMapClosure; | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
411 friend class CSetMarkOopClosure; |
342 | 412 friend class CMGlobalObjectClosure; |
413 friend class CMRemarkTask; | |
414 friend class CMConcurrentMarkingTask; | |
415 friend class G1ParNoteEndTask; | |
416 friend class CalcLiveObjectsClosure; | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3867
diff
changeset
|
417 friend class G1CMRefProcTaskProxy; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3867
diff
changeset
|
418 friend class G1CMRefProcTaskExecutor; |
2174
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2152
diff
changeset
|
419 friend class G1CMParKeepAliveAndDrainClosure; |
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2152
diff
changeset
|
420 friend class G1CMParDrainMarkingStackClosure; |
342 | 421 |
422 protected: | |
423 ConcurrentMarkThread* _cmThread; // the thread doing the work | |
424 G1CollectedHeap* _g1h; // the heap. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
425 uint _parallel_marking_threads; // the number of marking |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
426 // threads we're use |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
427 uint _max_parallel_marking_threads; // max number of marking |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
428 // threads we'll ever use |
342 | 429 double _sleep_factor; // how much we have to sleep, with |
430 // respect to the work we just did, to | |
431 // meet the marking overhead goal | |
432 double _marking_task_overhead; // marking target overhead for | |
433 // a single task | |
434 | |
435 // same as the two above, but for the cleanup task | |
436 double _cleanup_sleep_factor; | |
437 double _cleanup_task_overhead; | |
438 | |
2152 | 439 FreeRegionList _cleanup_list; |
342 | 440 |
4828
851b58c26def
7130334: G1: Change comments and error messages that refer to CMS in g1/concurrentMark.cpp/hpp
brutisso
parents:
4827
diff
changeset
|
441 // Concurrent marking support structures |
342 | 442 CMBitMap _markBitMap1; |
443 CMBitMap _markBitMap2; | |
444 CMBitMapRO* _prevMarkBitMap; // completed mark bitmap | |
445 CMBitMap* _nextMarkBitMap; // under-construction mark bitmap | |
446 bool _at_least_one_mark_complete; | |
447 | |
448 BitMap _region_bm; | |
449 BitMap _card_bm; | |
450 | |
451 // Heap bounds | |
452 HeapWord* _heap_start; | |
453 HeapWord* _heap_end; | |
454 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
455 // Root region tracking and claiming. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
456 CMRootRegions _root_regions; |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
457 |
342 | 458 // For gray objects |
459 CMMarkStack _markStack; // Grey objects behind global finger. | |
460 CMRegionStack _regionStack; // Grey regions behind global finger. | |
461 HeapWord* volatile _finger; // the global finger, region aligned, | |
462 // always points to the end of the | |
463 // last claimed region | |
464 | |
465 // marking tasks | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
466 uint _max_task_num; // maximum task number |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
467 uint _active_tasks; // task num currently active |
342 | 468 CMTask** _tasks; // task queue array (max_task_num len) |
469 CMTaskQueueSet* _task_queues; // task queue set | |
470 ParallelTaskTerminator _terminator; // for termination | |
471 | |
472 // Two sync barriers that are used to synchronise tasks when an | |
473 // overflow occurs. The algorithm is the following. All tasks enter | |
474 // the first one to ensure that they have all stopped manipulating | |
475 // the global data structures. After they exit it, they re-initialise | |
476 // their data structures and task 0 re-initialises the global data | |
477 // structures. Then, they enter the second sync barrier. This | |
478 // ensure, that no task starts doing work before all data | |
479 // structures (local and global) have been re-initialised. When they | |
480 // exit it, they are free to start working again. | |
481 WorkGangBarrierSync _first_overflow_barrier_sync; | |
482 WorkGangBarrierSync _second_overflow_barrier_sync; | |
483 | |
484 // this is set by any task, when an overflow on the global data | |
485 // structures is detected. | |
486 volatile bool _has_overflown; | |
487 // true: marking is concurrent, false: we're in remark | |
488 volatile bool _concurrent; | |
489 // set at the end of a Full GC so that marking aborts | |
490 volatile bool _has_aborted; | |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
491 |
342 | 492 // used when remark aborts due to an overflow to indicate that |
493 // another concurrent marking phase should start | |
494 volatile bool _restart_for_overflow; | |
495 | |
496 // This is true from the very start of concurrent marking until the | |
497 // point when all the tasks complete their work. It is really used | |
498 // to determine the points between the end of concurrent marking and | |
499 // time of remark. | |
500 volatile bool _concurrent_marking_in_progress; | |
501 | |
502 // verbose level | |
503 CMVerboseLevel _verbose_level; | |
504 | |
505 // These two fields are used to implement the optimisation that | |
506 // avoids pushing objects on the global/region stack if there are | |
507 // no collection set regions above the lowest finger. | |
508 | |
509 // This is the lowest finger (among the global and local fingers), | |
510 // which is calculated before a new collection set is chosen. | |
511 HeapWord* _min_finger; | |
512 // If this flag is true, objects/regions that are marked below the | |
513 // finger should be pushed on the stack(s). If this is flag is | |
514 // false, it is safe not to push them on the stack(s). | |
515 bool _should_gray_objects; | |
516 | |
517 // All of these times are in ms. | |
518 NumberSeq _init_times; | |
519 NumberSeq _remark_times; | |
520 NumberSeq _remark_mark_times; | |
521 NumberSeq _remark_weak_ref_times; | |
522 NumberSeq _cleanup_times; | |
523 double _total_counting_time; | |
524 double _total_rs_scrub_time; | |
525 | |
526 double* _accum_task_vtime; // accumulated task vtime | |
527 | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
528 FlexibleWorkGang* _parallel_workers; |
342 | 529 |
3316
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
530 ForceOverflowSettings _force_overflow_conc; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
531 ForceOverflowSettings _force_overflow_stw; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
532 |
342 | 533 void weakRefsWork(bool clear_all_soft_refs); |
534 | |
535 void swapMarkBitMaps(); | |
536 | |
537 // It resets the global marking data structures, as well as the | |
538 // task local ones; should be called during initial mark. | |
539 void reset(); | |
540 // It resets all the marking data structures. | |
3316
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
541 void clear_marking_state(bool clear_overflow = true); |
342 | 542 |
543 // It should be called to indicate which phase we're in (concurrent | |
544 // mark or remark) and how many threads are currently active. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
545 void set_phase(uint active_tasks, bool concurrent); |
342 | 546 // We do this after we're done with marking so that the marking data |
547 // structures are initialised to a sensible and predictable state. | |
548 void set_non_marking_state(); | |
549 | |
550 // prints all gathered CM-related statistics | |
551 void print_stats(); | |
552 | |
2152 | 553 bool cleanup_list_is_empty() { |
554 return _cleanup_list.is_empty(); | |
555 } | |
556 | |
342 | 557 // accessor methods |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
558 uint parallel_marking_threads() { return _parallel_marking_threads; } |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
559 uint max_parallel_marking_threads() { return _max_parallel_marking_threads;} |
342 | 560 double sleep_factor() { return _sleep_factor; } |
561 double marking_task_overhead() { return _marking_task_overhead;} | |
562 double cleanup_sleep_factor() { return _cleanup_sleep_factor; } | |
563 double cleanup_task_overhead() { return _cleanup_task_overhead;} | |
564 | |
565 HeapWord* finger() { return _finger; } | |
566 bool concurrent() { return _concurrent; } | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
567 uint active_tasks() { return _active_tasks; } |
342 | 568 ParallelTaskTerminator* terminator() { return &_terminator; } |
569 | |
570 // It claims the next available region to be scanned by a marking | |
571 // task. It might return NULL if the next region is empty or we have | |
572 // run out of regions. In the latter case, out_of_regions() | |
573 // determines whether we've really run out of regions or the task | |
574 // should call claim_region() again. This might seem a bit | |
575 // awkward. Originally, the code was written so that claim_region() | |
576 // either successfully returned with a non-empty region or there | |
577 // were no more regions to be claimed. The problem with this was | |
578 // that, in certain circumstances, it iterated over large chunks of | |
579 // the heap finding only empty regions and, while it was working, it | |
580 // was preventing the calling task to call its regular clock | |
581 // method. So, this way, each task will spend very little time in | |
582 // claim_region() and is allowed to call the regular clock method | |
583 // frequently. | |
584 HeapRegion* claim_region(int task); | |
585 | |
586 // It determines whether we've run out of regions to scan. | |
587 bool out_of_regions() { return _finger == _heap_end; } | |
588 | |
589 // Returns the task with the given id | |
590 CMTask* task(int id) { | |
1023
11d4857fe5e1
6888619: G1: too many guarantees in concurrent marking
tonyp
parents:
1019
diff
changeset
|
591 assert(0 <= id && id < (int) _active_tasks, |
11d4857fe5e1
6888619: G1: too many guarantees in concurrent marking
tonyp
parents:
1019
diff
changeset
|
592 "task id not within active bounds"); |
342 | 593 return _tasks[id]; |
594 } | |
595 | |
596 // Returns the task queue with the given id | |
597 CMTaskQueue* task_queue(int id) { | |
1023
11d4857fe5e1
6888619: G1: too many guarantees in concurrent marking
tonyp
parents:
1019
diff
changeset
|
598 assert(0 <= id && id < (int) _active_tasks, |
11d4857fe5e1
6888619: G1: too many guarantees in concurrent marking
tonyp
parents:
1019
diff
changeset
|
599 "task queue id not within active bounds"); |
342 | 600 return (CMTaskQueue*) _task_queues->queue(id); |
601 } | |
602 | |
603 // Returns the task queue set | |
604 CMTaskQueueSet* task_queues() { return _task_queues; } | |
605 | |
606 // Access / manipulation of the overflow flag which is set to | |
607 // indicate that the global stack or region stack has overflown | |
608 bool has_overflown() { return _has_overflown; } | |
609 void set_has_overflown() { _has_overflown = true; } | |
610 void clear_has_overflown() { _has_overflown = false; } | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
611 bool restart_for_overflow() { return _restart_for_overflow; } |
342 | 612 |
613 bool has_aborted() { return _has_aborted; } | |
614 | |
615 // Methods to enter the two overflow sync barriers | |
616 void enter_first_sync_barrier(int task_num); | |
617 void enter_second_sync_barrier(int task_num); | |
618 | |
3316
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
619 ForceOverflowSettings* force_overflow_conc() { |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
620 return &_force_overflow_conc; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
621 } |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
622 |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
623 ForceOverflowSettings* force_overflow_stw() { |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
624 return &_force_overflow_stw; |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
625 } |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
626 |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
627 ForceOverflowSettings* force_overflow() { |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
628 if (concurrent()) { |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
629 return force_overflow_conc(); |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
630 } else { |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
631 return force_overflow_stw(); |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
632 } |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
633 } |
cd8e33b2a8ad
7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents:
2435
diff
changeset
|
634 |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
635 // Live Data Counting data structures... |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
636 // These data structures are initialized at the start of |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
637 // marking. They are written to while marking is active. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
638 // They are aggregated during remark; the aggregated values |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
639 // are then used to populate the _region_bm, _card_bm, and |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
640 // the total live bytes, which are then subsequently updated |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
641 // during cleanup. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
642 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
643 // An array of bitmaps (one bit map per task). Each bitmap |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
644 // is used to record the cards spanned by the live objects |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
645 // marked by that task/worker. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
646 BitMap* _count_card_bitmaps; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
647 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
648 // Used to record the number of marked live bytes |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
649 // (for each region, by worker thread). |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
650 size_t** _count_marked_bytes; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
651 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
652 // Card index of the bottom of the G1 heap. Used for biasing indices into |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
653 // the card bitmaps. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
654 intptr_t _heap_bottom_card_num; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
655 |
342 | 656 public: |
657 // Manipulation of the global mark stack. | |
658 // Notice that the first mark_stack_push is CAS-based, whereas the | |
659 // two below are Mutex-based. This is OK since the first one is only | |
660 // called during evacuation pauses and doesn't compete with the | |
661 // other two (which are called by the marking tasks during | |
662 // concurrent marking or remark). | |
663 bool mark_stack_push(oop p) { | |
664 _markStack.par_push(p); | |
665 if (_markStack.overflow()) { | |
666 set_has_overflown(); | |
667 return false; | |
668 } | |
669 return true; | |
670 } | |
671 bool mark_stack_push(oop* arr, int n) { | |
672 _markStack.par_push_arr(arr, n); | |
673 if (_markStack.overflow()) { | |
674 set_has_overflown(); | |
675 return false; | |
676 } | |
677 return true; | |
678 } | |
679 void mark_stack_pop(oop* arr, int max, int* n) { | |
680 _markStack.par_pop_arr(arr, max, n); | |
681 } | |
3776
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
682 size_t mark_stack_size() { return _markStack.size(); } |
342 | 683 size_t partial_mark_stack_size_target() { return _markStack.maxElems()/3; } |
3776
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
684 bool mark_stack_overflow() { return _markStack.overflow(); } |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
685 bool mark_stack_empty() { return _markStack.isEmpty(); } |
342 | 686 |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
687 // (Lock-free) Manipulation of the region stack |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
688 bool region_stack_push_lock_free(MemRegion mr) { |
1358
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
689 // Currently we only call the lock-free version during evacuation |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
690 // pauses. |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
691 assert(SafepointSynchronize::is_at_safepoint(), "world should be stopped"); |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
692 |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
693 _regionStack.push_lock_free(mr); |
342 | 694 if (_regionStack.overflow()) { |
695 set_has_overflown(); | |
696 return false; | |
697 } | |
698 return true; | |
699 } | |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
700 |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
701 // Lock-free version of region-stack pop. Should only be |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
702 // called in tandem with other lock-free pops. |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
703 MemRegion region_stack_pop_lock_free() { |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
704 return _regionStack.pop_lock_free(); |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
705 } |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
706 |
1358
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
707 #if 0 |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
708 // The routines that manipulate the region stack with a lock are |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
709 // not currently used. They should be retained, however, as a |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
710 // diagnostic aid. |
1358
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
711 |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
712 bool region_stack_push_with_lock(MemRegion mr) { |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
713 // Currently we only call the lock-based version during either |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
714 // concurrent marking or remark. |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
715 assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(), |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
716 "if we are at a safepoint it should be the remark safepoint"); |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
717 |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
718 _regionStack.push_with_lock(mr); |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
719 if (_regionStack.overflow()) { |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
720 set_has_overflown(); |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
721 return false; |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
722 } |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
723 return true; |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
724 } |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
725 |
1358
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
726 MemRegion region_stack_pop_with_lock() { |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
727 // Currently we only call the lock-based version during either |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
728 // concurrent marking or remark. |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
729 assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(), |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
730 "if we are at a safepoint it should be the remark safepoint"); |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
731 |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
732 return _regionStack.pop_with_lock(); |
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
733 } |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
734 #endif |
1358
72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents:
1311
diff
changeset
|
735 |
342 | 736 int region_stack_size() { return _regionStack.size(); } |
737 bool region_stack_overflow() { return _regionStack.overflow(); } | |
738 bool region_stack_empty() { return _regionStack.isEmpty(); } | |
739 | |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
740 // Iterate over any regions that were aborted while draining the |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
741 // region stack (any such regions are saved in the corresponding |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
742 // CMTask) and invalidate (i.e. assign to the empty MemRegion()) |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
743 // any regions that point into the collection set. |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
744 bool invalidate_aborted_regions_in_cset(); |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
745 |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
746 // Returns true if there are any aborted memory regions. |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
747 bool has_aborted_regions(); |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
748 |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
749 CMRootRegions* root_regions() { return &_root_regions; } |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
750 |
342 | 751 bool concurrent_marking_in_progress() { |
752 return _concurrent_marking_in_progress; | |
753 } | |
754 void set_concurrent_marking_in_progress() { | |
755 _concurrent_marking_in_progress = true; | |
756 } | |
757 void clear_concurrent_marking_in_progress() { | |
758 _concurrent_marking_in_progress = false; | |
759 } | |
760 | |
761 void update_accum_task_vtime(int i, double vtime) { | |
762 _accum_task_vtime[i] += vtime; | |
763 } | |
764 | |
765 double all_task_accum_vtime() { | |
766 double ret = 0.0; | |
767 for (int i = 0; i < (int)_max_task_num; ++i) | |
768 ret += _accum_task_vtime[i]; | |
769 return ret; | |
770 } | |
771 | |
772 // Attempts to steal an object from the task queues of other tasks | |
773 bool try_stealing(int task_num, int* hash_seed, oop& obj) { | |
774 return _task_queues->steal(task_num, hash_seed, obj); | |
775 } | |
776 | |
777 // It grays an object by first marking it. Then, if it's behind the | |
778 // global finger, it also pushes it on the global stack. | |
779 void deal_with_reference(oop obj); | |
780 | |
781 ConcurrentMark(ReservedSpace rs, int max_regions); | |
782 ~ConcurrentMark(); | |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
783 |
342 | 784 ConcurrentMarkThread* cmThread() { return _cmThread; } |
785 | |
786 CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; } | |
787 CMBitMap* nextMarkBitMap() const { return _nextMarkBitMap; } | |
788 | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
789 // Returns the number of GC threads to be used in a concurrent |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
790 // phase based on the number of GC threads being used in a STW |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
791 // phase. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
792 uint scale_parallel_threads(uint n_par_threads); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
793 |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
794 // Calculates the number of GC threads to be used in a concurrent phase. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
795 uint calc_parallel_marking_threads(); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3979
diff
changeset
|
796 |
342 | 797 // The following three are interaction between CM and |
798 // G1CollectedHeap | |
799 | |
800 // This notifies CM that a root during initial-mark needs to be | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
801 // grayed. It is MT-safe. word_size is the size of the object in |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
802 // words. It is passed explicitly as sometimes we cannot calculate |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
803 // it from the given object because it might be in an inconsistent |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
804 // state (e.g., in to-space and being copied). So the caller is |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
805 // responsible for dealing with this issue (e.g., get the size from |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
806 // the from-space image when the to-space image might be |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
807 // inconsistent) and always passing the size. hr is the region that |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
808 // contains the object and it's passed optionally from callers who |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
809 // might already have it (no point in recalculating it). |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
810 inline void grayRoot(oop obj, size_t word_size, |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
811 uint worker_id, HeapRegion* hr = NULL); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
812 |
342 | 813 // It's used during evacuation pauses to gray a region, if |
814 // necessary, and it's MT-safe. It assumes that the caller has | |
815 // marked any objects on that region. If _should_gray_objects is | |
816 // true and we're still doing concurrent marking, the region is | |
817 // pushed on the region stack, if it is located below the global | |
818 // finger, otherwise we do nothing. | |
819 void grayRegionIfNecessary(MemRegion mr); | |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
820 |
342 | 821 // It's used during evacuation pauses to mark and, if necessary, |
822 // gray a single object and it's MT-safe. It assumes the caller did | |
823 // not mark the object. If _should_gray_objects is true and we're | |
824 // still doing concurrent marking, the objects is pushed on the | |
825 // global stack, if it is located below the global finger, otherwise | |
826 // we do nothing. | |
827 void markAndGrayObjectIfNecessary(oop p); | |
828 | |
1388 | 829 // It iterates over the heap and for each object it comes across it |
830 // will dump the contents of its reference fields, as well as | |
831 // liveness information for the object and its referents. The dump | |
832 // will be written to a file with the following name: | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
833 // G1PrintReachableBaseFile + "." + str. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
834 // vo decides whether the prev (vo == UsePrevMarking), the next |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
835 // (vo == UseNextMarking) marking information, or the mark word |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
836 // (vo == UseMarkWord) will be used to determine the liveness of |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
837 // each object / referent. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
838 // If all is true, all objects in the heap will be dumped, otherwise |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
839 // only the live ones. In the dump the following symbols / breviations |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
840 // are used: |
1388 | 841 // M : an explicitly live object (its bitmap bit is set) |
842 // > : an implicitly live object (over tams) | |
843 // O : an object outside the G1 heap (typically: in the perm gen) | |
844 // NOT : a reference field whose referent is not live | |
845 // AND MARKED : indicates that an object is both explicitly and | |
846 // implicitly live (it should be one or the other, not both) | |
847 void print_reachable(const char* str, | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3771
diff
changeset
|
848 VerifyOption vo, bool all) PRODUCT_RETURN; |
342 | 849 |
850 // Clear the next marking bitmap (will be called concurrently). | |
851 void clearNextBitmap(); | |
852 | |
853 // These two do the work that needs to be done before and after the | |
854 // initial root checkpoint. Since this checkpoint can be done at two | |
855 // different points (i.e. an explicit pause or piggy-backed on a | |
856 // young collection), then it's nice to be able to easily share the | |
857 // pre/post code. It might be the case that we can put everything in | |
858 // the post method. TP | |
859 void checkpointRootsInitialPre(); | |
860 void checkpointRootsInitialPost(); | |
861 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
862 // Scan all the root regions and mark everything reachable from |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
863 // them. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
864 void scanRootRegions(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
865 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
866 // Scan a single root region and mark everything reachable from it. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
867 void scanRootRegion(HeapRegion* hr, uint worker_id); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
868 |
342 | 869 // Do concurrent phase of marking, to a tentative transitive closure. |
870 void markFromRoots(); | |
871 | |
872 // Process all unprocessed SATB buffers. It is called at the | |
873 // beginning of an evacuation pause. | |
874 void drainAllSATBBuffers(); | |
875 | |
876 void checkpointRootsFinal(bool clear_all_soft_refs); | |
877 void checkpointRootsFinalWork(); | |
878 void cleanup(); | |
879 void completeCleanup(); | |
880 | |
881 // Mark in the previous bitmap. NB: this is usually read-only, so use | |
882 // this carefully! | |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
883 inline void markPrev(oop p); |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
884 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
885 // Clears marks for all objects in the given range, for the prev, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
886 // next, or both bitmaps. NB: the previous bitmap is usually |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
887 // read-only, so use this carefully! |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
888 void clearRangePrevBitmap(MemRegion mr); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
889 void clearRangeNextBitmap(MemRegion mr); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
890 void clearRangeBothBitmaps(MemRegion mr); |
342 | 891 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
892 // Notify data structures that a GC has started. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
893 void note_start_of_gc() { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
894 _markStack.note_start_of_gc(); |
342 | 895 } |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
896 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
897 // Notify data structures that a GC is finished. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
898 void note_end_of_gc() { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
899 _markStack.note_end_of_gc(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
900 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
901 |
342 | 902 // Iterate over the oops in the mark stack and all local queues. It |
903 // also calls invalidate_entries_into_cset() on the region stack. | |
904 void oops_do(OopClosure* f); | |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
905 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
906 // Verify that there are no CSet oops on the stacks (taskqueues / |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
907 // global mark stack), enqueued SATB buffers, per-thread SATB |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
908 // buffers, and fingers (global / per-task). The boolean parameters |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
909 // decide which of the above data structures to verify. If marking |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
910 // is not in progress, it's a no-op. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
911 void verify_no_cset_oops(bool verify_stacks, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
912 bool verify_enqueued_buffers, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
913 bool verify_thread_buffers, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
914 bool verify_fingers) PRODUCT_RETURN; |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
915 |
342 | 916 // It is called at the end of an evacuation pause during marking so |
917 // that CM is notified of where the new end of the heap is. It | |
918 // doesn't do anything if concurrent_marking_in_progress() is false, | |
919 // unless the force parameter is true. | |
920 void update_g1_committed(bool force = false); | |
921 | |
922 void complete_marking_in_collection_set(); | |
923 | |
924 // It indicates that a new collection set is being chosen. | |
925 void newCSet(); | |
3378
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
926 |
342 | 927 // It registers a collection set heap region with CM. This is used |
928 // to determine whether any heap regions are located above the finger. | |
929 void registerCSetRegion(HeapRegion* hr); | |
930 | |
3378
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
931 // Resets the region fields of any active CMTask whose region fields |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
932 // are in the collection set (i.e. the region currently claimed by |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
933 // the CMTask will be evacuated and may be used, subsequently, as |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
934 // an alloc region). When this happens the region fields in the CMTask |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
935 // are stale and, hence, should be cleared causing the worker thread |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
936 // to claim a new region. |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
937 void reset_active_task_region_fields_in_cset(); |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
938 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
939 // Registers the maximum region-end associated with a set of |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
940 // regions with CM. Again this is used to determine whether any |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
941 // heap regions are located above the finger. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
942 void register_collection_set_finger(HeapWord* max_finger) { |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
943 // max_finger is the highest heap region end of the regions currently |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
944 // contained in the collection set. If this value is larger than |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
945 // _min_finger then we need to gray objects. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
946 // This routine is like registerCSetRegion but for an entire |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
947 // collection of regions. |
3776
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
948 if (max_finger > _min_finger) { |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
949 _should_gray_objects = true; |
3776
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
950 } |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
951 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1388
diff
changeset
|
952 |
342 | 953 // Returns "true" if at least one mark has been completed. |
954 bool at_least_one_mark_complete() { return _at_least_one_mark_complete; } | |
955 | |
956 bool isMarked(oop p) const { | |
957 assert(p != NULL && p->is_oop(), "expected an oop"); | |
958 HeapWord* addr = (HeapWord*)p; | |
959 assert(addr >= _nextMarkBitMap->startWord() || | |
960 addr < _nextMarkBitMap->endWord(), "in a region"); | |
961 | |
962 return _nextMarkBitMap->isMarked(addr); | |
963 } | |
964 | |
965 inline bool not_yet_marked(oop p) const; | |
966 | |
967 // XXX Debug code | |
968 bool containing_card_is_marked(void* p); | |
969 bool containing_cards_are_marked(void* start, void* last); | |
970 | |
971 bool isPrevMarked(oop p) const { | |
972 assert(p != NULL && p->is_oop(), "expected an oop"); | |
973 HeapWord* addr = (HeapWord*)p; | |
974 assert(addr >= _prevMarkBitMap->startWord() || | |
975 addr < _prevMarkBitMap->endWord(), "in a region"); | |
976 | |
977 return _prevMarkBitMap->isMarked(addr); | |
978 } | |
979 | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
980 inline bool do_yield_check(uint worker_i = 0); |
342 | 981 inline bool should_yield(); |
982 | |
983 // Called to abort the marking cycle after a Full GC takes palce. | |
984 void abort(); | |
985 | |
986 // This prints the global/local fingers. It is used for debugging. | |
987 NOT_PRODUCT(void print_finger();) | |
988 | |
989 void print_summary_info(); | |
990 | |
1019 | 991 void print_worker_threads_on(outputStream* st) const; |
992 | |
342 | 993 // The following indicate whether a given verbose level has been |
994 // set. Notice that anything above stats is conditional to | |
995 // _MARKING_VERBOSE_ having been set to 1 | |
3776
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
996 bool verbose_stats() { |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
997 return _verbose_level >= stats_verbose; |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
998 } |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
999 bool verbose_low() { |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1000 return _MARKING_VERBOSE_ && _verbose_level >= low_verbose; |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1001 } |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1002 bool verbose_medium() { |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1003 return _MARKING_VERBOSE_ && _verbose_level >= medium_verbose; |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1004 } |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1005 bool verbose_high() { |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1006 return _MARKING_VERBOSE_ && _verbose_level >= high_verbose; |
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1007 } |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1008 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1009 // Counting data structure accessors |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1010 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1011 // Returns the card number of the bottom of the G1 heap. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1012 // Used in biasing indices into accounting card bitmaps. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1013 intptr_t heap_bottom_card_num() const { |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1014 return _heap_bottom_card_num; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1015 } |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1016 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1017 // Returns the card bitmap for a given task or worker id. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1018 BitMap* count_card_bitmap_for(uint worker_id) { |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1019 assert(0 <= worker_id && worker_id < _max_task_num, "oob"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1020 assert(_count_card_bitmaps != NULL, "uninitialized"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1021 BitMap* task_card_bm = &_count_card_bitmaps[worker_id]; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1022 assert(task_card_bm->size() == _card_bm.size(), "size mismatch"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1023 return task_card_bm; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1024 } |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1025 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1026 // Returns the array containing the marked bytes for each region, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1027 // for the given worker or task id. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1028 size_t* count_marked_bytes_array_for(uint worker_id) { |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1029 assert(0 <= worker_id && worker_id < _max_task_num, "oob"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1030 assert(_count_marked_bytes != NULL, "uninitialized"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1031 size_t* marked_bytes_array = _count_marked_bytes[worker_id]; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1032 assert(marked_bytes_array != NULL, "uninitialized"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1033 return marked_bytes_array; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1034 } |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1035 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1036 // Returns the index in the liveness accounting card table bitmap |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1037 // for the given address |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1038 inline BitMap::idx_t card_bitmap_index_for(HeapWord* addr); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1039 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1040 // Counts the size of the given memory region in the the given |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1041 // marked_bytes array slot for the given HeapRegion. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1042 // Sets the bits in the given card bitmap that are associated with the |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1043 // cards that are spanned by the memory region. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1044 inline void count_region(MemRegion mr, HeapRegion* hr, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1045 size_t* marked_bytes_array, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1046 BitMap* task_card_bm); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1047 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1048 // Counts the given memory region in the task/worker counting |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1049 // data structures for the given worker id. |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1050 inline void count_region(MemRegion mr, HeapRegion* hr, uint worker_id); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1051 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1052 // Counts the given memory region in the task/worker counting |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1053 // data structures for the given worker id. |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1054 inline void count_region(MemRegion mr, uint worker_id); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1055 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1056 // Counts the given object in the given task/worker counting |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1057 // data structures. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1058 inline void count_object(oop obj, HeapRegion* hr, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1059 size_t* marked_bytes_array, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1060 BitMap* task_card_bm); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1061 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1062 // Counts the given object in the task/worker counting data |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1063 // structures for the given worker id. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1064 inline void count_object(oop obj, HeapRegion* hr, uint worker_id); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1065 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1066 // Attempts to mark the given object and, if successful, counts |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1067 // the object in the given task/worker counting structures. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1068 inline bool par_mark_and_count(oop obj, HeapRegion* hr, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1069 size_t* marked_bytes_array, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1070 BitMap* task_card_bm); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1071 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1072 // Attempts to mark the given object and, if successful, counts |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1073 // the object in the task/worker counting structures for the |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1074 // given worker id. |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1075 inline bool par_mark_and_count(oop obj, size_t word_size, |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1076 HeapRegion* hr, uint worker_id); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1077 |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1078 // Attempts to mark the given object and, if successful, counts |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1079 // the object in the task/worker counting structures for the |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
1080 // given worker id. |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1081 inline bool par_mark_and_count(oop obj, HeapRegion* hr, uint worker_id); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1082 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1083 // Similar to the above routine but we don't know the heap region that |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1084 // contains the object to be marked/counted, which this routine looks up. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1085 inline bool par_mark_and_count(oop obj, uint worker_id); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1086 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1087 // Similar to the above routine but there are times when we cannot |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1088 // safely calculate the size of obj due to races and we, therefore, |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1089 // pass the size in as a parameter. It is the caller's reponsibility |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1090 // to ensure that the size passed in for obj is valid. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1091 inline bool par_mark_and_count(oop obj, size_t word_size, uint worker_id); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1092 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1093 // Unconditionally mark the given object, and unconditinally count |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1094 // the object in the counting structures for worker id 0. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1095 // Should *not* be called from parallel code. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1096 inline bool mark_and_count(oop obj, HeapRegion* hr); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1097 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1098 // Similar to the above routine but we don't know the heap region that |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1099 // contains the object to be marked/counted, which this routine looks up. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1100 // Should *not* be called from parallel code. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1101 inline bool mark_and_count(oop obj); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1102 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1103 protected: |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1104 // Clear all the per-task bitmaps and arrays used to store the |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1105 // counting data. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1106 void clear_all_count_data(); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1107 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1108 // Aggregates the counting data for each worker/task |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1109 // that was constructed while marking. Also sets |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1110 // the amount of marked bytes for each region and |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1111 // the top at concurrent mark count. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1112 void aggregate_count_data(); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1113 |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1114 // Verification routine |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1115 void verify_count_data(); |
342 | 1116 }; |
1117 | |
1118 // A class representing a marking task. | |
1119 class CMTask : public TerminatorTerminator { | |
1120 private: | |
1121 enum PrivateConstants { | |
1122 // the regular clock call is called once the scanned words reaches | |
1123 // this limit | |
1124 words_scanned_period = 12*1024, | |
1125 // the regular clock call is called once the number of visited | |
1126 // references reaches this limit | |
1127 refs_reached_period = 384, | |
1128 // initial value for the hash seed, used in the work stealing code | |
1129 init_hash_seed = 17, | |
1130 // how many entries will be transferred between global stack and | |
1131 // local queues | |
1132 global_stack_transfer_size = 16 | |
1133 }; | |
1134 | |
1135 int _task_id; | |
1136 G1CollectedHeap* _g1h; | |
1137 ConcurrentMark* _cm; | |
1138 CMBitMap* _nextMarkBitMap; | |
1139 // the task queue of this task | |
1140 CMTaskQueue* _task_queue; | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
1141 private: |
342 | 1142 // the task queue set---needed for stealing |
1143 CMTaskQueueSet* _task_queues; | |
1144 // indicates whether the task has been claimed---this is only for | |
1145 // debugging purposes | |
1146 bool _claimed; | |
1147 | |
1148 // number of calls to this task | |
1149 int _calls; | |
1150 | |
1151 // when the virtual timer reaches this time, the marking step should | |
1152 // exit | |
1153 double _time_target_ms; | |
1154 // the start time of the current marking step | |
1155 double _start_time_ms; | |
1156 | |
1157 // the oop closure used for iterations over oops | |
3771 | 1158 G1CMOopClosure* _cm_oop_closure; |
342 | 1159 |
1160 // the region this task is scanning, NULL if we're not scanning any | |
1161 HeapRegion* _curr_region; | |
1162 // the local finger of this task, NULL if we're not scanning a region | |
1163 HeapWord* _finger; | |
1164 // limit of the region this task is scanning, NULL if we're not scanning one | |
1165 HeapWord* _region_limit; | |
1166 | |
1167 // This is used only when we scan regions popped from the region | |
1168 // stack. It records what the last object on such a region we | |
1169 // scanned was. It is used to ensure that, if we abort region | |
1170 // iteration, we do not rescan the first part of the region. This | |
1171 // should be NULL when we're not scanning a region from the region | |
1172 // stack. | |
1173 HeapWord* _region_finger; | |
1174 | |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1175 // If we abort while scanning a region we record the remaining |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1176 // unscanned portion and check this field when marking restarts. |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1177 // This avoids having to push on the region stack while other |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1178 // marking threads may still be popping regions. |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1179 // If we were to push the unscanned portion directly to the |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1180 // region stack then we would need to using locking versions |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1181 // of the push and pop operations. |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1182 MemRegion _aborted_region; |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1183 |
342 | 1184 // the number of words this task has scanned |
1185 size_t _words_scanned; | |
1186 // When _words_scanned reaches this limit, the regular clock is | |
1187 // called. Notice that this might be decreased under certain | |
1188 // circumstances (i.e. when we believe that we did an expensive | |
1189 // operation). | |
1190 size_t _words_scanned_limit; | |
1191 // the initial value of _words_scanned_limit (i.e. what it was | |
1192 // before it was decreased). | |
1193 size_t _real_words_scanned_limit; | |
1194 | |
1195 // the number of references this task has visited | |
1196 size_t _refs_reached; | |
1197 // When _refs_reached reaches this limit, the regular clock is | |
1198 // called. Notice this this might be decreased under certain | |
1199 // circumstances (i.e. when we believe that we did an expensive | |
1200 // operation). | |
1201 size_t _refs_reached_limit; | |
1202 // the initial value of _refs_reached_limit (i.e. what it was before | |
1203 // it was decreased). | |
1204 size_t _real_refs_reached_limit; | |
1205 | |
1206 // used by the work stealing stuff | |
1207 int _hash_seed; | |
1208 // if this is true, then the task has aborted for some reason | |
1209 bool _has_aborted; | |
1210 // set when the task aborts because it has met its time quota | |
2174
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2152
diff
changeset
|
1211 bool _has_timed_out; |
342 | 1212 // true when we're draining SATB buffers; this avoids the task |
1213 // aborting due to SATB buffers being available (as we're already | |
1214 // dealing with them) | |
1215 bool _draining_satb_buffers; | |
1216 | |
1217 // number sequence of past step times | |
1218 NumberSeq _step_times_ms; | |
1219 // elapsed time of this task | |
1220 double _elapsed_time_ms; | |
1221 // termination time of this task | |
1222 double _termination_time_ms; | |
1223 // when this task got into the termination protocol | |
1224 double _termination_start_time_ms; | |
1225 | |
1226 // true when the task is during a concurrent phase, false when it is | |
1227 // in the remark phase (so, in the latter case, we do not have to | |
1228 // check all the things that we have to check during the concurrent | |
1229 // phase, i.e. SATB buffer availability...) | |
1230 bool _concurrent; | |
1231 | |
1232 TruncatedSeq _marking_step_diffs_ms; | |
1233 | |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1234 // Counting data structures. Embedding the task's marked_bytes_array |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1235 // and card bitmap into the actual task saves having to go through |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1236 // the ConcurrentMark object. |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1237 size_t* _marked_bytes_array; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1238 BitMap* _card_bm; |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1239 |
342 | 1240 // LOTS of statistics related with this task |
1241 #if _MARKING_STATS_ | |
1242 NumberSeq _all_clock_intervals_ms; | |
1243 double _interval_start_time_ms; | |
1244 | |
1245 int _aborted; | |
1246 int _aborted_overflow; | |
1247 int _aborted_cm_aborted; | |
1248 int _aborted_yield; | |
1249 int _aborted_timed_out; | |
1250 int _aborted_satb; | |
1251 int _aborted_termination; | |
1252 | |
1253 int _steal_attempts; | |
1254 int _steals; | |
1255 | |
1256 int _clock_due_to_marking; | |
1257 int _clock_due_to_scanning; | |
1258 | |
1259 int _local_pushes; | |
1260 int _local_pops; | |
1261 int _local_max_size; | |
1262 int _objs_scanned; | |
1263 | |
1264 int _global_pushes; | |
1265 int _global_pops; | |
1266 int _global_max_size; | |
1267 | |
1268 int _global_transfers_to; | |
1269 int _global_transfers_from; | |
1270 | |
1271 int _region_stack_pops; | |
1272 | |
1273 int _regions_claimed; | |
1274 int _objs_found_on_bitmap; | |
1275 | |
1276 int _satb_buffers_processed; | |
1277 #endif // _MARKING_STATS_ | |
1278 | |
1279 // it updates the local fields after this task has claimed | |
1280 // a new region to scan | |
1281 void setup_for_region(HeapRegion* hr); | |
1282 // it brings up-to-date the limit of the region | |
1283 void update_region_limit(); | |
1284 | |
1285 // called when either the words scanned or the refs visited limit | |
1286 // has been reached | |
1287 void reached_limit(); | |
1288 // recalculates the words scanned and refs visited limits | |
1289 void recalculate_limits(); | |
1290 // decreases the words scanned and refs visited limits when we reach | |
1291 // an expensive operation | |
1292 void decrease_limits(); | |
1293 // it checks whether the words scanned or refs visited reached their | |
1294 // respective limit and calls reached_limit() if they have | |
1295 void check_limits() { | |
1296 if (_words_scanned >= _words_scanned_limit || | |
3776
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1297 _refs_reached >= _refs_reached_limit) { |
342 | 1298 reached_limit(); |
3776
23d434c6290d
7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents:
3772
diff
changeset
|
1299 } |
342 | 1300 } |
1301 // this is supposed to be called regularly during a marking step as | |
1302 // it checks a bunch of conditions that might cause the marking step | |
1303 // to abort | |
1304 void regular_clock_call(); | |
1305 bool concurrent() { return _concurrent; } | |
1306 | |
1307 public: | |
1308 // It resets the task; it should be called right at the beginning of | |
1309 // a marking phase. | |
1310 void reset(CMBitMap* _nextMarkBitMap); | |
1311 // it clears all the fields that correspond to a claimed region. | |
1312 void clear_region_fields(); | |
1313 | |
1314 void set_concurrent(bool concurrent) { _concurrent = concurrent; } | |
1315 | |
1316 // The main method of this class which performs a marking step | |
1317 // trying not to exceed the given duration. However, it might exit | |
1318 // prematurely, according to some conditions (i.e. SATB buffers are | |
1319 // available for processing). | |
2174
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2152
diff
changeset
|
1320 void do_marking_step(double target_ms, bool do_stealing, bool do_termination); |
342 | 1321 |
1322 // These two calls start and stop the timer | |
1323 void record_start_time() { | |
1324 _elapsed_time_ms = os::elapsedTime() * 1000.0; | |
1325 } | |
1326 void record_end_time() { | |
1327 _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms; | |
1328 } | |
1329 | |
1330 // returns the task ID | |
1331 int task_id() { return _task_id; } | |
1332 | |
1333 // From TerminatorTerminator. It determines whether this task should | |
1334 // exit the termination protocol after it's entered it. | |
1335 virtual bool should_exit_termination(); | |
1336 | |
3378
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
1337 // Resets the local region fields after a task has finished scanning a |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
1338 // region; or when they have become stale as a result of the region |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
1339 // being evacuated. |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
1340 void giveup_current_region(); |
69293e516993
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents:
3316
diff
changeset
|
1341 |
342 | 1342 HeapWord* finger() { return _finger; } |
1343 | |
1344 bool has_aborted() { return _has_aborted; } | |
1345 void set_has_aborted() { _has_aborted = true; } | |
1346 void clear_has_aborted() { _has_aborted = false; } | |
2174
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2152
diff
changeset
|
1347 bool has_timed_out() { return _has_timed_out; } |
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2152
diff
changeset
|
1348 bool claimed() { return _claimed; } |
342 | 1349 |
1835
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1350 // Support routines for the partially scanned region that may be |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1351 // recorded as a result of aborting while draining the CMRegionStack |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1352 MemRegion aborted_region() { return _aborted_region; } |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1353 void set_aborted_region(MemRegion mr) |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1354 { _aborted_region = mr; } |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1355 |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1356 // Clears any recorded partially scanned region |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1357 void clear_aborted_region() { set_aborted_region(MemRegion()); } |
4805b9f4779e
6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents:
1552
diff
changeset
|
1358 |
3771 | 1359 void set_cm_oop_closure(G1CMOopClosure* cm_oop_closure); |
342 | 1360 |
1361 // It grays the object by marking it and, if necessary, pushing it | |
1362 // on the local queue | |
3771 | 1363 inline void deal_with_reference(oop obj); |
342 | 1364 |
1365 // It scans an object and visits its children. | |
3771 | 1366 void scan_object(oop obj); |
342 | 1367 |
1368 // It pushes an object on the local queue. | |
3771 | 1369 inline void push(oop obj); |
342 | 1370 |
1371 // These two move entries to/from the global stack. | |
1372 void move_entries_to_global_stack(); | |
1373 void get_entries_from_global_stack(); | |
1374 | |
1375 // It pops and scans objects from the local queue. If partially is | |
1376 // true, then it stops when the queue size is of a given limit. If | |
1377 // partially is false, then it stops when the queue is empty. | |
1378 void drain_local_queue(bool partially); | |
1379 // It moves entries from the global stack to the local queue and | |
1380 // drains the local queue. If partially is true, then it stops when | |
1381 // both the global stack and the local queue reach a given size. If | |
1382 // partially if false, it tries to empty them totally. | |
1383 void drain_global_stack(bool partially); | |
1384 // It keeps picking SATB buffers and processing them until no SATB | |
1385 // buffers are available. | |
1386 void drain_satb_buffers(); | |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4728
diff
changeset
|
1387 |
342 | 1388 // It keeps popping regions from the region stack and processing |
1389 // them until the region stack is empty. | |
1390 void drain_region_stack(BitMapClosure* closure); | |
1391 | |
1392 // moves the local finger to a new location | |
1393 inline void move_finger_to(HeapWord* new_finger) { | |
1023
11d4857fe5e1
6888619: G1: too many guarantees in concurrent marking
tonyp
parents:
1019
diff
changeset
|
1394 assert(new_finger >= _finger && new_finger < _region_limit, "invariant"); |
342 | 1395 _finger = new_finger; |
1396 } | |
1397 | |
1398 // moves the region finger to a new location | |
1399 inline void move_region_finger_to(HeapWord* new_finger) { | |
1023
11d4857fe5e1
6888619: G1: too many guarantees in concurrent marking
tonyp
parents:
1019
diff
changeset
|
1400 assert(new_finger < _cm->finger(), "invariant"); |
342 | 1401 _region_finger = new_finger; |
1402 } | |
1403 | |
1404 CMTask(int task_num, ConcurrentMark *cm, | |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4828
diff
changeset
|
1405 size_t* marked_bytes, BitMap* card_bm, |
342 | 1406 CMTaskQueue* task_queue, CMTaskQueueSet* task_queues); |
1407 | |
1408 // it prints statistics associated with this task | |
1409 void print_stats(); | |
1410 | |
1411 #if _MARKING_STATS_ | |
1412 void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; } | |
1413 #endif // _MARKING_STATS_ | |
1414 }; | |
1972 | 1415 |
2435
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1416 // Class that's used to to print out per-region liveness |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1417 // information. It's currently used at the end of marking and also |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1418 // after we sort the old regions at the end of the cleanup operation. |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1419 class G1PrintRegionLivenessInfoClosure: public HeapRegionClosure { |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1420 private: |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1421 outputStream* _out; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1422 |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1423 // Accumulators for these values. |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1424 size_t _total_used_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1425 size_t _total_capacity_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1426 size_t _total_prev_live_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1427 size_t _total_next_live_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1428 |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1429 // These are set up when we come across a "stars humongous" region |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1430 // (as this is where most of this information is stored, not in the |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1431 // subsequent "continues humongous" regions). After that, for every |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1432 // region in a given humongous region series we deduce the right |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1433 // values for it by simply subtracting the appropriate amount from |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1434 // these fields. All these values should reach 0 after we've visited |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1435 // the last region in the series. |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1436 size_t _hum_used_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1437 size_t _hum_capacity_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1438 size_t _hum_prev_live_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1439 size_t _hum_next_live_bytes; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1440 |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1441 static double perc(size_t val, size_t total) { |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1442 if (total == 0) { |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1443 return 0.0; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1444 } else { |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1445 return 100.0 * ((double) val / (double) total); |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1446 } |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1447 } |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1448 |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1449 static double bytes_to_mb(size_t val) { |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1450 return (double) val / (double) M; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1451 } |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1452 |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1453 // See the .cpp file. |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1454 size_t get_hum_bytes(size_t* hum_bytes); |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1455 void get_hum_bytes(size_t* used_bytes, size_t* capacity_bytes, |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1456 size_t* prev_live_bytes, size_t* next_live_bytes); |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1457 |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1458 public: |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1459 // The header and footer are printed in the constructor and |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1460 // destructor respectively. |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1461 G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name); |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1462 virtual bool doHeapRegion(HeapRegion* r); |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1463 ~G1PrintRegionLivenessInfoClosure(); |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1464 }; |
371bbc844bf1
7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents:
2174
diff
changeset
|
1465 |
1972 | 1466 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP |