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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
27
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
28 #include "gc_implementation/g1/heapRegionSets.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
29 #include "utilities/taskqueue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
30
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
31 class G1CollectedHeap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 // A generic CM bit map. This is essentially a wrapper around the BitMap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 // class, with one bit per (1<<_shifter) HeapWords.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 HeapWord* _bmStartWord; // base address of range covered by map
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61 size_t _bmWordSize; // map size (in #HeapWords covered)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 const int _shifter; // map to char or bit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63 VirtualSpace _virtual_space; // underlying the bit map
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 BitMap _bm; // the bit map itself
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67 // constructor
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 CMBitMapRO(ReservedSpace rs, int shifter);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 enum { do_yield = true };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 // inquiries
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 HeapWord* startWord() const { return _bmStartWord; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74 size_t sizeInWords() const { return _bmWordSize; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 // the following is one past the last word in space
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76 HeapWord* endWord() const { return _bmStartWord + _bmWordSize; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 // read marks
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 bool isMarked(HeapWord* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 "outside underlying space?");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
83 return _bm.at(heapWordToOffset(addr));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
84 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
85
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90 // Return the address corresponding to the next marked bit at or after
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91 // "addr", and before "limit", if "limit" is non-NULL. If there is no
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
92 // such bit, returns "limit" if that is non-NULL, or else "endWord()".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
93 HeapWord* getNextMarkedWordAddress(HeapWord* addr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
94 HeapWord* limit = NULL) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
95 // Return the address corresponding to the next unmarked bit at or after
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
96 // "addr", and before "limit", if "limit" is non-NULL. If there is no
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
97 // such bit, returns "limit" if that is non-NULL, or else "endWord()".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
98 HeapWord* getNextUnmarkedWordAddress(HeapWord* addr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99 HeapWord* limit = NULL) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
100
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
101 // conversion utilities
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 // XXX Fix these so that offsets are size_t's...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
103 HeapWord* offsetToHeapWord(size_t offset) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 return _bmStartWord + (offset << _shifter);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
105 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
106 size_t heapWordToOffset(HeapWord* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
107 return pointer_delta(addr, _bmStartWord) >> _shifter;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
108 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
109 int heapWordDiffToOffsetDiff(size_t diff) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
110 HeapWord* nextWord(HeapWord* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
111 return offsetToHeapWord(heapWordToOffset(addr) + 1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
112 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
113
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114 void mostly_disjoint_range_union(BitMap* from_bitmap,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 size_t from_start_index,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116 HeapWord* to_start_word,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117 size_t word_num);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
119 // debugging
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 NOT_PRODUCT(bool covers(ReservedSpace rs) const;)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
122
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
123 class CMBitMap : public CMBitMapRO {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
124
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
125 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126 // constructor
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 CMBitMap(ReservedSpace rs, int shifter) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128 CMBitMapRO(rs, shifter) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
129
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
130 // write marks
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
131 void mark(HeapWord* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
132 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
133 "outside underlying space?");
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
134 _bm.set_bit(heapWordToOffset(addr));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 void clear(HeapWord* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 "outside underlying space?");
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
139 _bm.clear_bit(heapWordToOffset(addr));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 bool parMark(HeapWord* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 "outside underlying space?");
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
144 return _bm.par_set_bit(heapWordToOffset(addr));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 bool parClear(HeapWord* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 "outside underlying space?");
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
149 return _bm.par_clear_bit(heapWordToOffset(addr));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 void markRange(MemRegion mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 void clearAll();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 void clearRange(MemRegion mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155 // Starting at the bit corresponding to "addr" (inclusive), find the next
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 // "1" bit, if any. This bit starts some run of consecutive "1"'s; find
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 // the end of this run (stopping at "end_addr"). Return the MemRegion
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 // covering from the start of the region corresponding to the first bit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
159 // of the run to the end of the region corresponding to the last bit of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 // the run. If there is no "1" bit at or after "addr", return an empty
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161 // MemRegion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162 MemRegion getAndClearMarkedRegion(HeapWord* addr, HeapWord* end_addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
165 // Represents a marking stack used by the CM collector.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 NOT_PRODUCT(jint _max_depth;) // max depth plumbed during run
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175 bool _overflow;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 DEBUG_ONLY(bool _drain_in_progress;)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 DEBUG_ONLY(bool _drain_in_progress_yields;)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 CMMarkStack(ConcurrentMark* cm);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 ~CMMarkStack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183 void allocate(size_t size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
184
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185 oop pop() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 if (!isEmpty()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 return _base[--_index] ;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
189 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 // If overflow happens, don't do the push, and record the overflow.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 // *Requires* that "ptr" is already marked.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 void push(oop ptr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 if (isFull()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 // Record overflow.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 _overflow = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200 _base[_index++] = ptr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 // Non-block impl. Note: concurrency is allowed only with other
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 // "par_push" operations, not with "pop" or "drain". We would need
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 // parallel versions of them if such concurrency was desired.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 void par_push(oop ptr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 // Pushes the first "n" elements of "ptr_arr" on the stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 // Non-block impl. Note: concurrency is allowed only with other
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 // "par_adjoin_arr" or "push" operations, not with "pop" or "drain".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 void par_adjoin_arr(oop* ptr_arr, int n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 // Pushes the first "n" elements of "ptr_arr" on the stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 // Locking impl: concurrency is allowed only with
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 // "par_push_arr" and/or "par_pop_arr" operations, which use the same
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 // locking strategy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 void par_push_arr(oop* ptr_arr, int n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220 // If returns false, the array was empty. Otherwise, removes up to "max"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221 // elements from the stack, and transfers them to "ptr_arr" in an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222 // unspecified order. The actual number transferred is given in "n" ("n
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
223 // == 0" is deliberately redundant with the return value.) Locking impl:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
224 // concurrency is allowed only with "par_push_arr" and/or "par_pop_arr"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 // operations, which use the same locking strategy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
226 bool par_pop_arr(oop* ptr_arr, int max, int* n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
227
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
228 // Drain the mark stack, applying the given closure to all fields of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 // objects on the stack. (That is, continue until the stack is empty,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230 // even if closure applications add entries to the stack.) The "bm"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231 // argument, if non-null, may be used to verify that only marked objects
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232 // are on the mark stack. If "yield_after" is "true", then the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 // concurrent marker performing the drain offers to yield after
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
234 // processing each object. If a yield occurs, stops the drain operation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 // and returns false. Otherwise, returns true.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236 template<class OopClosureClass>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 bool drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239 bool isEmpty() { return _index == 0; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
240 bool isFull() { return _index == _capacity; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 int maxElems() { return _capacity; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 bool overflow() { return _overflow; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244 void clear_overflow() { _overflow = false; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246 int size() { return _index; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
248 void setEmpty() { _index = 0; clear_overflow(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
256 // iterate over the oops in the mark stack, up to the bound recorded via
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
257 // the call above.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
258 void oops_do(OopClosure* f);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
259 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
262 MemRegion* _base;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
263 jint _capacity;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
264 jint _index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
265 jint _oops_do_bound;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
266 bool _overflow;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
267 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
268 CMRegionStack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
269 ~CMRegionStack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
270 void allocate(size_t size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
271
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
272 // This is lock-free; assumes that it will only be called in parallel
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
276 // Lock-free; assumes that it will only be called in parallel
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
291
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
292 bool isEmpty() { return _index == 0; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
293 bool isFull() { return _index == _capacity; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
294
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
295 bool overflow() { return _overflow; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
296 void clear_overflow() { _overflow = false; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
297
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
298 int size() { return _index; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
299
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
300 // It iterates over the entries in the region stack and it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
301 // invalidates (i.e. assigns MemRegion()) the ones that point to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
302 // regions in the collection set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
303 bool invalidate_entries_into_cset();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
304
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
305 // This gives an upper bound up to which the iteration in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
306 // invalidate_entries_into_cset() will reach. This prevents
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
307 // newly-added entries to be unnecessarily scanned.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
308 void set_oops_do_bound() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
309 _oops_do_bound = _index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
310 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
311
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
312 void setEmpty() { _index = 0; clear_overflow(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
313 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
328 // this will enable a variety of different statistics per GC task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
329 #define _MARKING_STATS_ 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
330 // this will enable the higher verbose levels
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
331 #define _MARKING_VERBOSE_ 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
332
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
333 #if _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
334 #define statsOnly(statement) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
335 do { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 statement ; \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
337 } while (0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
338 #else // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
339 #define statsOnly(statement) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
340 do { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
341 } while (0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
342 #endif // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
343
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
344 typedef enum {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
345 no_verbose = 0, // verbose turned off
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
346 stats_verbose, // only prints stats at the end of marking
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
347 low_verbose, // low verbose, mostly per region and per major event
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
348 medium_verbose, // a bit more detailed than low
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
349 high_verbose // per object verbose
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
350 } CMVerboseLevel;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
404
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
405 class ConcurrentMarkThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
406
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
407 class ConcurrentMark : public CHeapObj {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
408 friend class ConcurrentMarkThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
409 friend class CMTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
412 friend class CMGlobalObjectClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
413 friend class CMRemarkTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
414 friend class CMConcurrentMarkingTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
415 friend class G1ParNoteEndTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
421
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
422 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
423 ConcurrentMarkThread* _cmThread; // the thread doing the work
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
429 double _sleep_factor; // how much we have to sleep, with
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
430 // respect to the work we just did, to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
431 // meet the marking overhead goal
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
432 double _marking_task_overhead; // marking target overhead for
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
433 // a single task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
434
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
435 // same as the two above, but for the cleanup task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
436 double _cleanup_sleep_factor;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
437 double _cleanup_task_overhead;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
438
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
439 FreeRegionList _cleanup_list;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
442 CMBitMap _markBitMap1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
443 CMBitMap _markBitMap2;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
444 CMBitMapRO* _prevMarkBitMap; // completed mark bitmap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
445 CMBitMap* _nextMarkBitMap; // under-construction mark bitmap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
446 bool _at_least_one_mark_complete;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
447
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
448 BitMap _region_bm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
449 BitMap _card_bm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
450
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
451 // Heap bounds
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
452 HeapWord* _heap_start;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
453 HeapWord* _heap_end;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
458 // For gray objects
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
459 CMMarkStack _markStack; // Grey objects behind global finger.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
460 CMRegionStack _regionStack; // Grey regions behind global finger.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
461 HeapWord* volatile _finger; // the global finger, region aligned,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
462 // always points to the end of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
463 // last claimed region
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
464
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
468 CMTask** _tasks; // task queue array (max_task_num len)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
469 CMTaskQueueSet* _task_queues; // task queue set
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
470 ParallelTaskTerminator _terminator; // for termination
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
471
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
472 // Two sync barriers that are used to synchronise tasks when an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473 // overflow occurs. The algorithm is the following. All tasks enter
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
474 // the first one to ensure that they have all stopped manipulating
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
475 // the global data structures. After they exit it, they re-initialise
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
476 // their data structures and task 0 re-initialises the global data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
477 // structures. Then, they enter the second sync barrier. This
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
478 // ensure, that no task starts doing work before all data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
479 // structures (local and global) have been re-initialised. When they
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
480 // exit it, they are free to start working again.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
481 WorkGangBarrierSync _first_overflow_barrier_sync;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
482 WorkGangBarrierSync _second_overflow_barrier_sync;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
483
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484 // this is set by any task, when an overflow on the global data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
485 // structures is detected.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
486 volatile bool _has_overflown;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
487 // true: marking is concurrent, false: we're in remark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
488 volatile bool _concurrent;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
489 // set at the end of a Full GC so that marking aborts
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
492 // used when remark aborts due to an overflow to indicate that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
493 // another concurrent marking phase should start
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494 volatile bool _restart_for_overflow;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
495
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
496 // This is true from the very start of concurrent marking until the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
497 // point when all the tasks complete their work. It is really used
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
498 // to determine the points between the end of concurrent marking and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
499 // time of remark.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
500 volatile bool _concurrent_marking_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
501
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
502 // verbose level
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
503 CMVerboseLevel _verbose_level;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
504
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
505 // These two fields are used to implement the optimisation that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
506 // avoids pushing objects on the global/region stack if there are
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
507 // no collection set regions above the lowest finger.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
508
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
509 // This is the lowest finger (among the global and local fingers),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
510 // which is calculated before a new collection set is chosen.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
511 HeapWord* _min_finger;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
512 // If this flag is true, objects/regions that are marked below the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
513 // finger should be pushed on the stack(s). If this is flag is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
514 // false, it is safe not to push them on the stack(s).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
515 bool _should_gray_objects;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
516
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
517 // All of these times are in ms.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
518 NumberSeq _init_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
519 NumberSeq _remark_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
520 NumberSeq _remark_mark_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
521 NumberSeq _remark_weak_ref_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
522 NumberSeq _cleanup_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
523 double _total_counting_time;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
524 double _total_rs_scrub_time;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
525
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
526 double* _accum_task_vtime; // accumulated task vtime
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
527
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 3979
diff changeset
528 FlexibleWorkGang* _parallel_workers;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
533 void weakRefsWork(bool clear_all_soft_refs);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
534
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
535 void swapMarkBitMaps();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
536
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
537 // It resets the global marking data structures, as well as the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
538 // task local ones; should be called during initial mark.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
539 void reset();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
542
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
543 // It should be called to indicate which phase we're in (concurrent
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
546 // We do this after we're done with marking so that the marking data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
547 // structures are initialised to a sensible and predictable state.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
548 void set_non_marking_state();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
549
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
550 // prints all gathered CM-related statistics
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
551 void print_stats();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
552
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
553 bool cleanup_list_is_empty() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
554 return _cleanup_list.is_empty();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
555 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
556
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
560 double sleep_factor() { return _sleep_factor; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
561 double marking_task_overhead() { return _marking_task_overhead;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
562 double cleanup_sleep_factor() { return _cleanup_sleep_factor; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
563 double cleanup_task_overhead() { return _cleanup_task_overhead;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
564
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
565 HeapWord* finger() { return _finger; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
568 ParallelTaskTerminator* terminator() { return &_terminator; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
569
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
570 // It claims the next available region to be scanned by a marking
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
571 // task. It might return NULL if the next region is empty or we have
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
572 // run out of regions. In the latter case, out_of_regions()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
573 // determines whether we've really run out of regions or the task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
574 // should call claim_region() again. This might seem a bit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
575 // awkward. Originally, the code was written so that claim_region()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
576 // either successfully returned with a non-empty region or there
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
577 // were no more regions to be claimed. The problem with this was
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
578 // that, in certain circumstances, it iterated over large chunks of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
579 // the heap finding only empty regions and, while it was working, it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
580 // was preventing the calling task to call its regular clock
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
581 // method. So, this way, each task will spend very little time in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
582 // claim_region() and is allowed to call the regular clock method
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
583 // frequently.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
584 HeapRegion* claim_region(int task);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
585
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
586 // It determines whether we've run out of regions to scan.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
587 bool out_of_regions() { return _finger == _heap_end; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
588
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
589 // Returns the task with the given id
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
593 return _tasks[id];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
594 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
595
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
596 // Returns the task queue with the given id
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
600 return (CMTaskQueue*) _task_queues->queue(id);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
601 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
602
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
603 // Returns the task queue set
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
604 CMTaskQueueSet* task_queues() { return _task_queues; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
605
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
606 // Access / manipulation of the overflow flag which is set to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
607 // indicate that the global stack or region stack has overflown
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
608 bool has_overflown() { return _has_overflown; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
609 void set_has_overflown() { _has_overflown = true; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
612
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
613 bool has_aborted() { return _has_aborted; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
614
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
615 // Methods to enter the two overflow sync barriers
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
616 void enter_first_sync_barrier(int task_num);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
617 void enter_second_sync_barrier(int task_num);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
656 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
657 // Manipulation of the global mark stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
658 // Notice that the first mark_stack_push is CAS-based, whereas the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
659 // two below are Mutex-based. This is OK since the first one is only
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
660 // called during evacuation pauses and doesn't compete with the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
661 // other two (which are called by the marking tasks during
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
662 // concurrent marking or remark).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
663 bool mark_stack_push(oop p) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
664 _markStack.par_push(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
665 if (_markStack.overflow()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
666 set_has_overflown();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
667 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
668 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
669 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
670 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
671 bool mark_stack_push(oop* arr, int n) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
672 _markStack.par_push_arr(arr, n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
673 if (_markStack.overflow()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
674 set_has_overflown();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
675 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
676 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
677 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
678 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
679 void mark_stack_pop(oop* arr, int max, int* n) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
680 _markStack.par_pop_arr(arr, max, n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
694 if (_regionStack.overflow()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
695 set_has_overflown();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
696 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
697 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
698 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
736 int region_stack_size() { return _regionStack.size(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
737 bool region_stack_overflow() { return _regionStack.overflow(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
738 bool region_stack_empty() { return _regionStack.isEmpty(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
751 bool concurrent_marking_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
752 return _concurrent_marking_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
753 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
754 void set_concurrent_marking_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
755 _concurrent_marking_in_progress = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
756 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
757 void clear_concurrent_marking_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
758 _concurrent_marking_in_progress = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
759 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
760
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
761 void update_accum_task_vtime(int i, double vtime) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
762 _accum_task_vtime[i] += vtime;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
763 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
764
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
765 double all_task_accum_vtime() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
766 double ret = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
767 for (int i = 0; i < (int)_max_task_num; ++i)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
768 ret += _accum_task_vtime[i];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
769 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
770 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
771
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
772 // Attempts to steal an object from the task queues of other tasks
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
773 bool try_stealing(int task_num, int* hash_seed, oop& obj) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
774 return _task_queues->steal(task_num, hash_seed, obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
775 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
776
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
777 // It grays an object by first marking it. Then, if it's behind the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
778 // global finger, it also pushes it on the global stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
779 void deal_with_reference(oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
780
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
781 ConcurrentMark(ReservedSpace rs, int max_regions);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
782 ~ConcurrentMark();
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
783
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
784 ConcurrentMarkThread* cmThread() { return _cmThread; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
785
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
786 CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
787 CMBitMap* nextMarkBitMap() const { return _nextMarkBitMap; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
797 // The following three are interaction between CM and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
798 // G1CollectedHeap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
799
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
813 // It's used during evacuation pauses to gray a region, if
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
814 // necessary, and it's MT-safe. It assumes that the caller has
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
815 // marked any objects on that region. If _should_gray_objects is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
816 // true and we're still doing concurrent marking, the region is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
817 // pushed on the region stack, if it is located below the global
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
818 // finger, otherwise we do nothing.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
821 // It's used during evacuation pauses to mark and, if necessary,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
822 // gray a single object and it's MT-safe. It assumes the caller did
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
823 // not mark the object. If _should_gray_objects is true and we're
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
824 // still doing concurrent marking, the objects is pushed on the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
825 // global stack, if it is located below the global finger, otherwise
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
826 // we do nothing.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
827 void markAndGrayObjectIfNecessary(oop p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
828
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
829 // It iterates over the heap and for each object it comes across it
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
830 // will dump the contents of its reference fields, as well as
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
831 // liveness information for the object and its referents. The dump
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
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
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
841 // M : an explicitly live object (its bitmap bit is set)
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
842 // > : an implicitly live object (over tams)
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
843 // O : an object outside the G1 heap (typically: in the perm gen)
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
844 // NOT : a reference field whose referent is not live
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
845 // AND MARKED : indicates that an object is both explicitly and
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
846 // implicitly live (it should be one or the other, not both)
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
849
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
850 // Clear the next marking bitmap (will be called concurrently).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
851 void clearNextBitmap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
852
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
853 // These two do the work that needs to be done before and after the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
854 // initial root checkpoint. Since this checkpoint can be done at two
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
855 // different points (i.e. an explicit pause or piggy-backed on a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
856 // young collection), then it's nice to be able to easily share the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
857 // pre/post code. It might be the case that we can put everything in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
858 // the post method. TP
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
859 void checkpointRootsInitialPre();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
860 void checkpointRootsInitialPost();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
869 // Do concurrent phase of marking, to a tentative transitive closure.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
870 void markFromRoots();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
871
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
872 // Process all unprocessed SATB buffers. It is called at the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
873 // beginning of an evacuation pause.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
874 void drainAllSATBBuffers();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
875
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
876 void checkpointRootsFinal(bool clear_all_soft_refs);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
877 void checkpointRootsFinalWork();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
878 void cleanup();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
879 void completeCleanup();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
880
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
881 // Mark in the previous bitmap. NB: this is usually read-only, so use
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
902 // Iterate over the oops in the mark stack and all local queues. It
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
903 // also calls invalidate_entries_into_cset() on the region stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
916 // It is called at the end of an evacuation pause during marking so
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
917 // that CM is notified of where the new end of the heap is. It
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
918 // doesn't do anything if concurrent_marking_in_progress() is false,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
919 // unless the force parameter is true.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
920 void update_g1_committed(bool force = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
921
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
922 void complete_marking_in_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
923
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
924 // It indicates that a new collection set is being chosen.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
925 void newCSet();
3378
69293e516993 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 3316
diff changeset
926
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
927 // It registers a collection set heap region with CM. This is used
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
928 // to determine whether any heap regions are located above the finger.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
929 void registerCSetRegion(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
953 // Returns "true" if at least one mark has been completed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
954 bool at_least_one_mark_complete() { return _at_least_one_mark_complete; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
955
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
956 bool isMarked(oop p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
957 assert(p != NULL && p->is_oop(), "expected an oop");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
958 HeapWord* addr = (HeapWord*)p;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
959 assert(addr >= _nextMarkBitMap->startWord() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
960 addr < _nextMarkBitMap->endWord(), "in a region");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
961
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
962 return _nextMarkBitMap->isMarked(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
963 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
964
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
965 inline bool not_yet_marked(oop p) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
966
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
967 // XXX Debug code
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
968 bool containing_card_is_marked(void* p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
969 bool containing_cards_are_marked(void* start, void* last);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
970
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
971 bool isPrevMarked(oop p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
972 assert(p != NULL && p->is_oop(), "expected an oop");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
973 HeapWord* addr = (HeapWord*)p;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
974 assert(addr >= _prevMarkBitMap->startWord() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
975 addr < _prevMarkBitMap->endWord(), "in a region");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
976
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
977 return _prevMarkBitMap->isMarked(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
978 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
981 inline bool should_yield();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
982
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
983 // Called to abort the marking cycle after a Full GC takes palce.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
984 void abort();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986 // This prints the global/local fingers. It is used for debugging.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
987 NOT_PRODUCT(void print_finger();)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
988
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
989 void print_summary_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
990
1019
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
991 void print_worker_threads_on(outputStream* st) const;
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
992
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993 // The following indicate whether a given verbose level has been
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
994 // set. Notice that anything above stats is conditional to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1116 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1117
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1118 // A class representing a marking task.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1119 class CMTask : public TerminatorTerminator {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1120 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1121 enum PrivateConstants {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1122 // the regular clock call is called once the scanned words reaches
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1123 // this limit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1124 words_scanned_period = 12*1024,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1125 // the regular clock call is called once the number of visited
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1126 // references reaches this limit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1127 refs_reached_period = 384,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1128 // initial value for the hash seed, used in the work stealing code
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1129 init_hash_seed = 17,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1130 // how many entries will be transferred between global stack and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1131 // local queues
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1132 global_stack_transfer_size = 16
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1133 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1134
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1135 int _task_id;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1136 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1137 ConcurrentMark* _cm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1138 CMBitMap* _nextMarkBitMap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1139 // the task queue of this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1140 CMTaskQueue* _task_queue;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 579
diff changeset
1141 private:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1142 // the task queue set---needed for stealing
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1143 CMTaskQueueSet* _task_queues;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1144 // indicates whether the task has been claimed---this is only for
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1145 // debugging purposes
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1146 bool _claimed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1147
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1148 // number of calls to this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1149 int _calls;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1150
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1151 // when the virtual timer reaches this time, the marking step should
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1152 // exit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1153 double _time_target_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1154 // the start time of the current marking step
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1155 double _start_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1156
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1157 // the oop closure used for iterations over oops
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1158 G1CMOopClosure* _cm_oop_closure;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1159
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1160 // the region this task is scanning, NULL if we're not scanning any
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1161 HeapRegion* _curr_region;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1162 // the local finger of this task, NULL if we're not scanning a region
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1163 HeapWord* _finger;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1164 // limit of the region this task is scanning, NULL if we're not scanning one
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1165 HeapWord* _region_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1166
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1167 // This is used only when we scan regions popped from the region
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1168 // stack. It records what the last object on such a region we
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1169 // scanned was. It is used to ensure that, if we abort region
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1170 // iteration, we do not rescan the first part of the region. This
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1171 // should be NULL when we're not scanning a region from the region
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1172 // stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1173 HeapWord* _region_finger;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1184 // the number of words this task has scanned
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1185 size_t _words_scanned;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1186 // When _words_scanned reaches this limit, the regular clock is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1187 // called. Notice that this might be decreased under certain
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1188 // circumstances (i.e. when we believe that we did an expensive
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1189 // operation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1190 size_t _words_scanned_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1191 // the initial value of _words_scanned_limit (i.e. what it was
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1192 // before it was decreased).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1193 size_t _real_words_scanned_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1194
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1195 // the number of references this task has visited
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1196 size_t _refs_reached;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1197 // When _refs_reached reaches this limit, the regular clock is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1198 // called. Notice this this might be decreased under certain
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1199 // circumstances (i.e. when we believe that we did an expensive
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1200 // operation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1201 size_t _refs_reached_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1202 // the initial value of _refs_reached_limit (i.e. what it was before
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1203 // it was decreased).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1204 size_t _real_refs_reached_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1205
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1206 // used by the work stealing stuff
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1207 int _hash_seed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1208 // if this is true, then the task has aborted for some reason
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1209 bool _has_aborted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1212 // true when we're draining SATB buffers; this avoids the task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1213 // aborting due to SATB buffers being available (as we're already
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1214 // dealing with them)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1215 bool _draining_satb_buffers;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1216
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1217 // number sequence of past step times
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1218 NumberSeq _step_times_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1219 // elapsed time of this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1220 double _elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1221 // termination time of this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1222 double _termination_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1223 // when this task got into the termination protocol
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1224 double _termination_start_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1225
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1226 // true when the task is during a concurrent phase, false when it is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1227 // in the remark phase (so, in the latter case, we do not have to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1228 // check all the things that we have to check during the concurrent
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1229 // phase, i.e. SATB buffer availability...)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1230 bool _concurrent;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1231
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1232 TruncatedSeq _marking_step_diffs_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1240 // LOTS of statistics related with this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1241 #if _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1242 NumberSeq _all_clock_intervals_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1243 double _interval_start_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1244
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1245 int _aborted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1246 int _aborted_overflow;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1247 int _aborted_cm_aborted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1248 int _aborted_yield;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1249 int _aborted_timed_out;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1250 int _aborted_satb;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1251 int _aborted_termination;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1252
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1253 int _steal_attempts;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1254 int _steals;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1255
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1256 int _clock_due_to_marking;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1257 int _clock_due_to_scanning;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1258
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1259 int _local_pushes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1260 int _local_pops;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1261 int _local_max_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1262 int _objs_scanned;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1263
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1264 int _global_pushes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1265 int _global_pops;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1266 int _global_max_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1267
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1268 int _global_transfers_to;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1269 int _global_transfers_from;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1270
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1271 int _region_stack_pops;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1272
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1273 int _regions_claimed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1274 int _objs_found_on_bitmap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1275
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1276 int _satb_buffers_processed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1277 #endif // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1278
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1279 // it updates the local fields after this task has claimed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1280 // a new region to scan
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1281 void setup_for_region(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1282 // it brings up-to-date the limit of the region
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1283 void update_region_limit();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1284
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1285 // called when either the words scanned or the refs visited limit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1286 // has been reached
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1287 void reached_limit();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1288 // recalculates the words scanned and refs visited limits
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1289 void recalculate_limits();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1290 // decreases the words scanned and refs visited limits when we reach
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1291 // an expensive operation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1292 void decrease_limits();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1293 // it checks whether the words scanned or refs visited reached their
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1294 // respective limit and calls reached_limit() if they have
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1295 void check_limits() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1298 reached_limit();
3776
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
1299 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1300 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1301 // this is supposed to be called regularly during a marking step as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1302 // it checks a bunch of conditions that might cause the marking step
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1303 // to abort
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1304 void regular_clock_call();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1305 bool concurrent() { return _concurrent; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1306
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1307 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1308 // It resets the task; it should be called right at the beginning of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1309 // a marking phase.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1310 void reset(CMBitMap* _nextMarkBitMap);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1311 // it clears all the fields that correspond to a claimed region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1312 void clear_region_fields();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1313
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1314 void set_concurrent(bool concurrent) { _concurrent = concurrent; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1315
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1316 // The main method of this class which performs a marking step
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1317 // trying not to exceed the given duration. However, it might exit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1318 // prematurely, according to some conditions (i.e. SATB buffers are
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1321
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1322 // These two calls start and stop the timer
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1323 void record_start_time() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1324 _elapsed_time_ms = os::elapsedTime() * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1325 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1326 void record_end_time() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1327 _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1328 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1329
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1330 // returns the task ID
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1331 int task_id() { return _task_id; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1332
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1333 // From TerminatorTerminator. It determines whether this task should
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1334 // exit the termination protocol after it's entered it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1335 virtual bool should_exit_termination();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1342 HeapWord* finger() { return _finger; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1343
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1344 bool has_aborted() { return _has_aborted; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1345 void set_has_aborted() { _has_aborted = true; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1359 void set_cm_oop_closure(G1CMOopClosure* cm_oop_closure);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1360
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1361 // It grays the object by marking it and, if necessary, pushing it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1362 // on the local queue
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1363 inline void deal_with_reference(oop obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1364
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1365 // It scans an object and visits its children.
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1366 void scan_object(oop obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1367
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1368 // It pushes an object on the local queue.
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1369 inline void push(oop obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1370
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1371 // These two move entries to/from the global stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1372 void move_entries_to_global_stack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1373 void get_entries_from_global_stack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1374
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1375 // It pops and scans objects from the local queue. If partially is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1376 // true, then it stops when the queue size is of a given limit. If
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1377 // partially is false, then it stops when the queue is empty.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1378 void drain_local_queue(bool partially);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1379 // It moves entries from the global stack to the local queue and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1380 // drains the local queue. If partially is true, then it stops when
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1381 // both the global stack and the local queue reach a given size. If
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1382 // partially if false, it tries to empty them totally.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1383 void drain_global_stack(bool partially);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1384 // It keeps picking SATB buffers and processing them until no SATB
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1385 // buffers are available.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1388 // It keeps popping regions from the region stack and processing
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1389 // them until the region stack is empty.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1390 void drain_region_stack(BitMapClosure* closure);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1391
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1392 // moves the local finger to a new location
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1395 _finger = new_finger;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1396 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1397
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1398 // moves the region finger to a new location
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1401 _region_finger = new_finger;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1402 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1403
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1406 CMTaskQueue* task_queue, CMTaskQueueSet* task_queues);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1407
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1408 // it prints statistics associated with this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1409 void print_stats();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1410
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1411 #if _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1412 void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1413 #endif // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1414 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
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
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
1466 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP