annotate src/share/vm/gc_implementation/g1/concurrentMark.hpp @ 20211:82693fb204a5

8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet Summary: The test incorrectly assumed that it had been started with no other previous compilation activity. Fix this by allowing multiple code root free chunk lists, and use one separate from the global one to perform the test. Reviewed-by: brutisso
author tschatzl
date Wed, 16 Apr 2014 10:14:50 +0200
parents 581e70386ec9
children 2c6ef90f030a
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 /*
7450
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
2 * Copyright (c) 2001, 2013, 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
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 12080
diff changeset
28 #include "gc_implementation/g1/heapRegionSet.hpp"
20190
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17950
diff changeset
29 #include "gc_implementation/shared/gcId.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
30 #include "utilities/taskqueue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
31
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
32 class G1CollectedHeap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
33 class CMTask;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6010
diff changeset
34 typedef GenericTaskQueue<oop, mtGC> CMTaskQueue;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6010
diff changeset
35 typedef GenericTaskQueueSet<CMTaskQueue, mtGC> CMTaskQueueSet;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36
2037
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
37 // Closure used by CM during concurrent reference discovery
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
38 // and reference processing (during remarking) to determine
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
39 // 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
40 // to determine if referents of discovered reference objects
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
41 // are alive. An instance is also embedded into the
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
42 // reference processor as the _is_alive_non_header field
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
43 class G1CMIsAliveClosure: public BoolObjectClosure {
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
44 G1CollectedHeap* _g1;
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
45 public:
5988
2a0172480595 7127697: G1: remove dead code after recent concurrent mark changes
tonyp
parents: 4837
diff changeset
46 G1CMIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) { }
2037
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 bool do_object_b(oop obj);
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
49 };
b03260081e9b 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 1972
diff changeset
50
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51 // 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
52 // class, with one bit per (1<<_shifter) HeapWords.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53
549
fe3d7c11b4b7 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 342
diff changeset
54 class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 HeapWord* _bmStartWord; // base address of range covered by map
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 size_t _bmWordSize; // map size (in #HeapWords covered)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58 const int _shifter; // map to char or bit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59 VirtualSpace _virtual_space; // underlying the bit map
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 BitMap _bm; // the bit map itself
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63 // constructor
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
64 CMBitMapRO(int shifter);
342
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 enum { do_yield = true };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 // inquiries
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 HeapWord* startWord() const { return _bmStartWord; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 size_t sizeInWords() const { return _bmWordSize; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71 // the following is one past the last word in space
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 HeapWord* endWord() const { return _bmStartWord + _bmWordSize; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74 // read marks
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76 bool isMarked(HeapWord* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 "outside underlying space?");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 return _bm.at(heapWordToOffset(addr));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 // iteration
4827
2e966d967c5c 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 4787
diff changeset
83 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
84 inline bool iterate(BitMapClosure* cl);
342
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 // 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
87 // "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
88 // 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
89 HeapWord* getNextMarkedWordAddress(HeapWord* addr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90 HeapWord* limit = NULL) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91 // 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
92 // "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
93 // 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
94 HeapWord* getNextUnmarkedWordAddress(HeapWord* addr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
95 HeapWord* limit = NULL) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
96
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
97 // conversion utilities
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
98 HeapWord* offsetToHeapWord(size_t offset) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99 return _bmStartWord + (offset << _shifter);
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 size_t heapWordToOffset(HeapWord* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 return pointer_delta(addr, _bmStartWord) >> _shifter;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
103 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 int heapWordDiffToOffsetDiff(size_t diff) const;
8733
9def4075da6d 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 8014
diff changeset
105
9def4075da6d 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 8014
diff changeset
106 // The argument addr should be the start address of a valid object
9def4075da6d 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 8014
diff changeset
107 HeapWord* nextObject(HeapWord* addr) {
9def4075da6d 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 8014
diff changeset
108 oop obj = (oop) addr;
9def4075da6d 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 8014
diff changeset
109 HeapWord* res = addr + obj->size();
9def4075da6d 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 8014
diff changeset
110 assert(offsetToHeapWord(heapWordToOffset(res)) == res, "sanity");
9def4075da6d 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 8014
diff changeset
111 return res;
342
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
9076
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8788
diff changeset
114 void print_on_error(outputStream* st, const char* prefix) const;
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8788
diff changeset
115
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116 // debugging
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117 NOT_PRODUCT(bool covers(ReservedSpace rs) const;)
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 class CMBitMap : public CMBitMapRO {
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 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
123 // constructor
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
124 CMBitMap(int shifter) :
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
125 CMBitMapRO(shifter) {}
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
126
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
127 // Allocates the back store for the marking bitmap
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
128 bool allocate(ReservedSpace heap_rs);
342
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
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
165 // Represents a marking stack used by ConcurrentMarking in the G1 collector.
549
fe3d7c11b4b7 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 342
diff changeset
166 class CMMarkStack VALUE_OBJ_CLASS_SPEC {
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
167 VirtualSpace _virtual_space; // Underlying backing store for actual stack
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
168 ConcurrentMark* _cm;
8787
fa08949fe0cb 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 8733
diff changeset
169 oop* _base; // bottom of stack
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
170 jint _index; // one more than last occupied index
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
171 jint _capacity; // max #elements
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
172 jint _saved_index; // value of _index saved at start of GC
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
173 NOT_PRODUCT(jint _max_depth;) // max depth plumbed during run
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
175 bool _overflow;
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
176 bool _should_expand;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 DEBUG_ONLY(bool _drain_in_progress;)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 DEBUG_ONLY(bool _drain_in_progress_yields;)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 CMMarkStack(ConcurrentMark* cm);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182 ~CMMarkStack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
184 #ifndef PRODUCT
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
185 jint max_depth() const {
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
186 return _max_depth;
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
187 }
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
188 #endif
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
189
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
190 bool allocate(size_t capacity);
342
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 oop pop() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 if (!isEmpty()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 return _base[--_index] ;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 // 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
200 // *Requires* that "ptr" is already marked.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 void push(oop ptr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 if (isFull()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 // Record overflow.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 _overflow = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 _base[_index++] = ptr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 // Non-block impl. Note: concurrency is allowed only with other
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 // "par_push" operations, not with "pop" or "drain". We would need
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 // parallel versions of them if such concurrency was desired.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 void par_push(oop ptr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 // Pushes the first "n" elements of "ptr_arr" on the stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 // Non-block impl. Note: concurrency is allowed only with other
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 // "par_adjoin_arr" or "push" operations, not with "pop" or "drain".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219 void par_adjoin_arr(oop* ptr_arr, int n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221 // Pushes the first "n" elements of "ptr_arr" on the stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222 // Locking impl: concurrency is allowed only with
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
223 // "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
224 // locking strategy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 void par_push_arr(oop* ptr_arr, int n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
226
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
227 // 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
228 // 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
229 // unspecified order. The actual number transferred is given in "n" ("n
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230 // == 0" is deliberately redundant with the return value.) Locking impl:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231 // 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
232 // operations, which use the same locking strategy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 bool par_pop_arr(oop* ptr_arr, int max, int* n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
234
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 // 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
236 // 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
237 // even if closure applications add entries to the stack.) The "bm"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 // 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
239 // 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
240 // concurrent marker performing the drain offers to yield after
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 // processing each object. If a yield occurs, stops the drain operation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 // and returns false. Otherwise, returns true.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 template<class OopClosureClass>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244 bool drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after = 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 bool isEmpty() { return _index == 0; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247 bool isFull() { return _index == _capacity; }
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
248 int maxElems() { return _capacity; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
249
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
250 bool overflow() { return _overflow; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
251 void clear_overflow() { _overflow = false; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
252
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
253 bool should_expand() const { return _should_expand; }
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
254 void set_should_expand();
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
255
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
256 // Expand the stack, typically in response to an overflow condition
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
257 void expand();
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
258
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
259 int size() { return _index; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
260
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
261 void setEmpty() { _index = 0; clear_overflow(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
262
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
263 // Record the current index.
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
264 void note_start_of_gc();
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
265
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
266 // 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
267 void note_end_of_gc();
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
268
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
269 // 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
270 // the call above.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
271 void oops_do(OopClosure* f);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
272 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
273
3316
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
274 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
275 private:
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
276 #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
277 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
278 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
279 #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
280
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
281 public:
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
282 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
283 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
284 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
285 };
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
286
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
287 // this will enable a variety of different statistics per GC task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
288 #define _MARKING_STATS_ 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
289 // this will enable the higher verbose levels
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
290 #define _MARKING_VERBOSE_ 0
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 #if _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
293 #define statsOnly(statement) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
294 do { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
295 statement ; \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
296 } while (0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
297 #else // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
298 #define statsOnly(statement) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
299 do { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
300 } while (0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
301 #endif // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
302
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
303 typedef enum {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
304 no_verbose = 0, // verbose turned off
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
305 stats_verbose, // only prints stats at the end of marking
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
306 low_verbose, // low verbose, mostly per region and per major event
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
307 medium_verbose, // a bit more detailed than low
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
308 high_verbose // per object verbose
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
309 } CMVerboseLevel;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
310
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
311 class YoungList;
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
312
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
313 // 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
314 // 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
315 // 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
316 // 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
317 // 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
318 // 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
319 // 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
320 // 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
321 // 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
322 //
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
323 // 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
324 // 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
325 // regions populated during the initial-mark pause.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
326 class CMRootRegions VALUE_OBJ_CLASS_SPEC {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
327 private:
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
328 YoungList* _young_list;
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
329 ConcurrentMark* _cm;
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
330
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
331 volatile bool _scan_in_progress;
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
332 volatile bool _should_abort;
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
333 HeapRegion* volatile _next_survivor;
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
334
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
335 public:
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
336 CMRootRegions();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
337 // 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
338 void init(G1CollectedHeap* g1h, ConcurrentMark* cm);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
339
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
340 // Reset the claiming / scanning of the root regions.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
341 void prepare_for_scan();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
342
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
343 // 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
344 void abort() { _should_abort = true; }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
345
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
346 // 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
347 // false otherwise.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
348 bool scan_in_progress() { return _scan_in_progress; }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
349
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
350 // 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
351 // all have been claimed.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
352 HeapRegion* claim_next();
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 // 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
355 // 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
356 // have been claimed.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
357 void scan_finished();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
358
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
359 // 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
360 // 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
361 bool wait_until_scan_finished();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
362 };
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
363
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
364 class ConcurrentMarkThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
365
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6010
diff changeset
366 class ConcurrentMark: public CHeapObj<mtGC> {
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
367 friend class CMMarkStack;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
368 friend class ConcurrentMarkThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
369 friend class CMTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
370 friend class CMBitMapClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
371 friend class CMGlobalObjectClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
372 friend class CMRemarkTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
373 friend class CMConcurrentMarkingTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
374 friend class G1ParNoteEndTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
375 friend class CalcLiveObjectsClosure;
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3867
diff changeset
376 friend class G1CMRefProcTaskProxy;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3867
diff changeset
377 friend class G1CMRefProcTaskExecutor;
8014
f90b9bceb8e5 8005032: G1: Cleanup serial reference processing closures in concurrent marking
johnc
parents: 8008
diff changeset
378 friend class G1CMKeepAliveAndDrainClosure;
f90b9bceb8e5 8005032: G1: Cleanup serial reference processing closures in concurrent marking
johnc
parents: 8008
diff changeset
379 friend class G1CMDrainMarkingStackClosure;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
380
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
381 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
382 ConcurrentMarkThread* _cmThread; // the thread doing the work
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
383 G1CollectedHeap* _g1h; // the heap.
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
384 uint _parallel_marking_threads; // the number of marking
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 3979
diff changeset
385 // threads we're use
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
386 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
387 // threads we'll ever use
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
388 double _sleep_factor; // how much we have to sleep, with
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
389 // respect to the work we just did, to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
390 // meet the marking overhead goal
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
391 double _marking_task_overhead; // marking target overhead for
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
392 // a single task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
393
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
394 // same as the two above, but for the cleanup task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
395 double _cleanup_sleep_factor;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
396 double _cleanup_task_overhead;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
397
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
398 FreeRegionList _cleanup_list;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
399
4828
851b58c26def 7130334: G1: Change comments and error messages that refer to CMS in g1/concurrentMark.cpp/hpp
brutisso
parents: 4827
diff changeset
400 // Concurrent marking support structures
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
401 CMBitMap _markBitMap1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
402 CMBitMap _markBitMap2;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
403 CMBitMapRO* _prevMarkBitMap; // completed mark bitmap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
404 CMBitMap* _nextMarkBitMap; // under-construction mark bitmap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
405
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
406 BitMap _region_bm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
407 BitMap _card_bm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
408
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
409 // Heap bounds
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
410 HeapWord* _heap_start;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
411 HeapWord* _heap_end;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
412
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
413 // Root region tracking and claiming.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
414 CMRootRegions _root_regions;
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
415
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
416 // For gray objects
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
417 CMMarkStack _markStack; // Grey objects behind global finger.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
418 HeapWord* volatile _finger; // the global finger, region aligned,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
419 // always points to the end of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
420 // last claimed region
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 // marking tasks
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
423 uint _max_worker_id;// maximum worker id
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
424 uint _active_tasks; // task num currently active
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
425 CMTask** _tasks; // task queue array (max_worker_id len)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
426 CMTaskQueueSet* _task_queues; // task queue set
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
427 ParallelTaskTerminator _terminator; // for termination
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
428
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
429 // Two sync barriers that are used to synchronise tasks when an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
430 // overflow occurs. The algorithm is the following. All tasks enter
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
431 // the first one to ensure that they have all stopped manipulating
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
432 // the global data structures. After they exit it, they re-initialise
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
433 // their data structures and task 0 re-initialises the global data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
434 // structures. Then, they enter the second sync barrier. This
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
435 // ensure, that no task starts doing work before all data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
436 // structures (local and global) have been re-initialised. When they
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
437 // exit it, they are free to start working again.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
438 WorkGangBarrierSync _first_overflow_barrier_sync;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
439 WorkGangBarrierSync _second_overflow_barrier_sync;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
440
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
441 // 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
442 // structures is detected.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
443 volatile bool _has_overflown;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
444 // true: marking is concurrent, false: we're in remark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
445 volatile bool _concurrent;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
446 // 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
447 volatile bool _has_aborted;
20190
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17950
diff changeset
448 GCId _aborted_gc_id;
1835
4805b9f4779e 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 1552
diff changeset
449
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
450 // used when remark aborts due to an overflow to indicate that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
451 // another concurrent marking phase should start
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
452 volatile bool _restart_for_overflow;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
453
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
454 // 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
455 // 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
456 // to determine the points between the end of concurrent marking and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
457 // time of remark.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
458 volatile bool _concurrent_marking_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
459
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
460 // verbose level
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
461 CMVerboseLevel _verbose_level;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
462
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
463 // All of these times are in ms.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
464 NumberSeq _init_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
465 NumberSeq _remark_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
466 NumberSeq _remark_mark_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
467 NumberSeq _remark_weak_ref_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
468 NumberSeq _cleanup_times;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
469 double _total_counting_time;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
470 double _total_rs_scrub_time;
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 double* _accum_task_vtime; // accumulated task vtime
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 3979
diff changeset
474 FlexibleWorkGang* _parallel_workers;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
475
3316
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
476 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
477 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
478
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
479 void weakRefsWork(bool clear_all_soft_refs);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
480
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
481 void swapMarkBitMaps();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
482
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
483 // It resets the global marking data structures, as well as the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484 // task local ones; should be called during initial mark.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
485 void reset();
7450
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
486
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
487 // Resets all the marking data structures. Called when we have to restart
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
488 // marking or when marking completes (via set_non_marking_state below).
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
489 void reset_marking_state(bool clear_overflow = true);
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
490
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
491 // We do this after we're done with marking so that the marking data
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
492 // structures are initialised to a sensible and predictable state.
d275c3dc73e6 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 7397
diff changeset
493 void set_non_marking_state();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494
8788
e864cc14ca75 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 8787
diff changeset
495 // Called to indicate how many threads are currently active.
e864cc14ca75 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 8787
diff changeset
496 void set_concurrency(uint active_tasks);
e864cc14ca75 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 8787
diff changeset
497
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
498 // 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
499 // mark or remark) and how many threads are currently active.
8788
e864cc14ca75 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 8787
diff changeset
500 void set_concurrency_and_phase(uint active_tasks, bool concurrent);
342
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 // prints all gathered CM-related statistics
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
503 void print_stats();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
504
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
505 bool cleanup_list_is_empty() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
506 return _cleanup_list.is_empty();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
507 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2037
diff changeset
508
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
509 // accessor methods
8008
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
510 uint parallel_marking_threads() const { return _parallel_marking_threads; }
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
511 uint max_parallel_marking_threads() const { return _max_parallel_marking_threads;}
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
512 double sleep_factor() { return _sleep_factor; }
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
513 double marking_task_overhead() { return _marking_task_overhead;}
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
514 double cleanup_sleep_factor() { return _cleanup_sleep_factor; }
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
515 double cleanup_task_overhead() { return _cleanup_task_overhead;}
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
516
8008
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
517 bool use_parallel_marking_threads() const {
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
518 assert(parallel_marking_threads() <=
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
519 max_parallel_marking_threads(), "sanity");
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
520 assert((_parallel_workers == NULL && parallel_marking_threads() == 0) ||
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
521 parallel_marking_threads() > 0,
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
522 "parallel workers not set up correctly");
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
523 return _parallel_workers != NULL;
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
524 }
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
525
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
526 HeapWord* finger() { return _finger; }
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
527 bool concurrent() { return _concurrent; }
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
528 uint active_tasks() { return _active_tasks; }
256d3f43c177 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 7450
diff changeset
529 ParallelTaskTerminator* terminator() { return &_terminator; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
530
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
531 // It claims the next available region to be scanned by a marking
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
532 // task/thread. It might return NULL if the next region is empty or
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
533 // we have run out of regions. In the latter case, out_of_regions()
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
534 // determines whether we've really run out of regions or the task
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
535 // should call claim_region() again. This might seem a bit
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
536 // awkward. Originally, the code was written so that claim_region()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
537 // either successfully returned with a non-empty region or there
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
538 // 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
539 // that, in certain circumstances, it iterated over large chunks of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
540 // 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
541 // was preventing the calling task to call its regular clock
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
542 // 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
543 // claim_region() and is allowed to call the regular clock method
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
544 // frequently.
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
545 HeapRegion* claim_region(uint worker_id);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
546
17950
8a140676873f 8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime()
pliden
parents: 17736
diff changeset
547 // It determines whether we've run out of regions to scan. Note that
8a140676873f 8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime()
pliden
parents: 17736
diff changeset
548 // the finger can point past the heap end in case the heap was expanded
8a140676873f 8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime()
pliden
parents: 17736
diff changeset
549 // to satisfy an allocation without doing a GC. This is fine, because all
8a140676873f 8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime()
pliden
parents: 17736
diff changeset
550 // objects in those regions will be considered live anyway because of
8a140676873f 8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime()
pliden
parents: 17736
diff changeset
551 // SATB guarantees (i.e. their TAMS will be equal to bottom).
8a140676873f 8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime()
pliden
parents: 17736
diff changeset
552 bool out_of_regions() { return _finger >= _heap_end; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
553
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
554 // Returns the task with the given id
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
555 CMTask* task(int id) {
1023
11d4857fe5e1 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 1019
diff changeset
556 assert(0 <= id && id < (int) _active_tasks,
11d4857fe5e1 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 1019
diff changeset
557 "task id not within active bounds");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
558 return _tasks[id];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
559 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
560
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
561 // Returns the task queue with the given id
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
562 CMTaskQueue* task_queue(int id) {
1023
11d4857fe5e1 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 1019
diff changeset
563 assert(0 <= id && id < (int) _active_tasks,
11d4857fe5e1 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 1019
diff changeset
564 "task queue id not within active bounds");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
565 return (CMTaskQueue*) _task_queues->queue(id);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
566 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
567
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
568 // Returns the task queue set
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
569 CMTaskQueueSet* task_queues() { return _task_queues; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
570
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
571 // Access / manipulation of the overflow flag which is set to
5988
2a0172480595 7127697: G1: remove dead code after recent concurrent mark changes
tonyp
parents: 4837
diff changeset
572 // indicate that the global stack has overflown
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
573 bool has_overflown() { return _has_overflown; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
574 void set_has_overflown() { _has_overflown = true; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
575 void clear_has_overflown() { _has_overflown = false; }
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
576 bool restart_for_overflow() { return _restart_for_overflow; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
577
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
578 // Methods to enter the two overflow sync barriers
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
579 void enter_first_sync_barrier(uint worker_id);
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
580 void enter_second_sync_barrier(uint worker_id);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
581
3316
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
582 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
583 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
584 }
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
585
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
586 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
587 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
588 }
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
589
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
590 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
591 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
592 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
593 } else {
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
594 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
595 }
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
596 }
cd8e33b2a8ad 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 2435
diff changeset
597
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
598 // Live Data Counting data structures...
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
599 // These data structures are initialized at the start of
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
600 // marking. They are written to while marking is active.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
601 // They are aggregated during remark; the aggregated values
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
602 // 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
603 // the total live bytes, which are then subsequently updated
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
604 // during cleanup.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
605
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
606 // 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
607 // 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
608 // marked by that task/worker.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
609 BitMap* _count_card_bitmaps;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
610
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
611 // Used to record the number of marked live bytes
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
612 // (for each region, by worker thread).
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
613 size_t** _count_marked_bytes;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
614
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
615 // 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
616 // the card bitmaps.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
617 intptr_t _heap_bottom_card_num;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
618
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
619 // Set to true when initialization is complete
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
620 bool _completed_initialization;
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
621
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
622 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
623 // Manipulation of the global mark stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
624 // 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
625 // 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
626 // called during evacuation pauses and doesn't compete with the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
627 // other two (which are called by the marking tasks during
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
628 // concurrent marking or remark).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
629 bool mark_stack_push(oop p) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
630 _markStack.par_push(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
631 if (_markStack.overflow()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
632 set_has_overflown();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
633 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
634 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
635 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
636 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
637 bool mark_stack_push(oop* arr, int n) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
638 _markStack.par_push_arr(arr, n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
639 if (_markStack.overflow()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
640 set_has_overflown();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
641 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
642 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
643 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
644 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
645 void mark_stack_pop(oop* arr, int max, int* n) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
646 _markStack.par_pop_arr(arr, max, n);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
647 }
3776
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
648 size_t mark_stack_size() { return _markStack.size(); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
649 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
650 bool mark_stack_overflow() { return _markStack.overflow(); }
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
651 bool mark_stack_empty() { return _markStack.isEmpty(); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
652
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
653 CMRootRegions* root_regions() { return &_root_regions; }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
654
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
655 bool concurrent_marking_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
656 return _concurrent_marking_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
657 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
658 void set_concurrent_marking_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
659 _concurrent_marking_in_progress = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
660 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
661 void clear_concurrent_marking_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
662 _concurrent_marking_in_progress = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
663 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
664
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
665 void update_accum_task_vtime(int i, double vtime) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
666 _accum_task_vtime[i] += vtime;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
667 }
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 double all_task_accum_vtime() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
670 double ret = 0.0;
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
671 for (uint i = 0; i < _max_worker_id; ++i)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
672 ret += _accum_task_vtime[i];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
673 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
674 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
675
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
676 // Attempts to steal an object from the task queues of other tasks
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
677 bool try_stealing(uint worker_id, int* hash_seed, oop& obj) {
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
678 return _task_queues->steal(worker_id, hash_seed, obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
679 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
680
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
681 ConcurrentMark(G1CollectedHeap* g1h, ReservedSpace heap_rs);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
682 ~ConcurrentMark();
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
683
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
684 ConcurrentMarkThread* cmThread() { return _cmThread; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
685
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
686 CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
687 CMBitMap* nextMarkBitMap() const { return _nextMarkBitMap; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
688
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 3979
diff changeset
689 // 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
690 // 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
691 // phase.
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
692 uint scale_parallel_threads(uint n_par_threads);
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 3979
diff changeset
693
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 3979
diff changeset
694 // 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
695 uint calc_parallel_marking_threads();
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 3979
diff changeset
696
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
697 // The following three are interaction between CM and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
698 // G1CollectedHeap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
699
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
700 // 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
701 // 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
702 // 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
703 // 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
704 // 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
705 // 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
706 // 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
707 // 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
708 // 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
709 // 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
710 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
711 uint worker_id, HeapRegion* hr = NULL);
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
712
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
713 // 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
714 // 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
715 // liveness information for the object and its referents. The dump
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
716 // 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
717 // G1PrintReachableBaseFile + "." + str.
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3771
diff changeset
718 // vo decides whether the prev (vo == UsePrevMarking), the next
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3771
diff changeset
719 // (vo == UseNextMarking) marking information, or the mark word
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3771
diff changeset
720 // (vo == UseMarkWord) will be used to determine the liveness of
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3771
diff changeset
721 // each object / referent.
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3771
diff changeset
722 // 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
723 // 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
724 // are used:
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
725 // M : an explicitly live object (its bitmap bit is set)
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
726 // > : an implicitly live object (over tams)
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
727 // 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
728 // NOT : a reference field whose referent is not live
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
729 // AND MARKED : indicates that an object is both explicitly and
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1358
diff changeset
730 // 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
731 void print_reachable(const char* str,
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3771
diff changeset
732 VerifyOption vo, bool all) PRODUCT_RETURN;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
733
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
734 // Clear the next marking bitmap (will be called concurrently).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
735 void clearNextBitmap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
736
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
737 // 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
738 // initial root checkpoint. Since this checkpoint can be done at two
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
739 // 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
740 // 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
741 // 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
742 // the post method. TP
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
743 void checkpointRootsInitialPre();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
744 void checkpointRootsInitialPost();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
745
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
746 // 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
747 // them.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
748 void scanRootRegions();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
749
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
750 // 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
751 void scanRootRegion(HeapRegion* hr, uint worker_id);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
752
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
753 // Do concurrent phase of marking, to a tentative transitive closure.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
754 void markFromRoots();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
755
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
756 void checkpointRootsFinal(bool clear_all_soft_refs);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
757 void checkpointRootsFinalWork();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
758 void cleanup();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
759 void completeCleanup();
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 // 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
762 // this carefully!
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
763 inline void markPrev(oop p);
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
764
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
765 // 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
766 // 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
767 // read-only, so use this carefully!
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
768 void clearRangePrevBitmap(MemRegion mr);
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
769 void clearRangeNextBitmap(MemRegion mr);
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
770 void clearRangeBothBitmaps(MemRegion mr);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
771
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
772 // 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
773 void note_start_of_gc() {
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
774 _markStack.note_start_of_gc();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
775 }
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
776
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
777 // 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
778 void note_end_of_gc() {
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
779 _markStack.note_end_of_gc();
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
780 }
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
781
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
782 // 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
783 // 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
784 // 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
785 // 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
786 // 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
787 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
788 bool verify_enqueued_buffers,
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
789 bool verify_thread_buffers,
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
790 bool verify_fingers) PRODUCT_RETURN;
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
791
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
792 // 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
793 // 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
794 // doesn't do anything if concurrent_marking_in_progress() is false,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
795 // unless the force parameter is true.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
796 void update_g1_committed(bool force = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
797
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
798 bool isMarked(oop p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
799 assert(p != NULL && p->is_oop(), "expected an oop");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
800 HeapWord* addr = (HeapWord*)p;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
801 assert(addr >= _nextMarkBitMap->startWord() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
802 addr < _nextMarkBitMap->endWord(), "in a region");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
803
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
804 return _nextMarkBitMap->isMarked(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
805 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
806
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
807 inline bool not_yet_marked(oop p) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
808
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
809 // XXX Debug code
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
810 bool containing_card_is_marked(void* p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
811 bool containing_cards_are_marked(void* start, void* last);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
812
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
813 bool isPrevMarked(oop p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
814 assert(p != NULL && p->is_oop(), "expected an oop");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
815 HeapWord* addr = (HeapWord*)p;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
816 assert(addr >= _prevMarkBitMap->startWord() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
817 addr < _prevMarkBitMap->endWord(), "in a region");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
818
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
819 return _prevMarkBitMap->isMarked(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
820 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
821
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
822 inline bool do_yield_check(uint worker_i = 0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
823
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
824 // 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
825 void abort();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
826
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10327
diff changeset
827 bool has_aborted() { return _has_aborted; }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10327
diff changeset
828
20190
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17950
diff changeset
829 const GCId& concurrent_gc_id();
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17950
diff changeset
830
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
831 // This prints the global/local fingers. It is used for debugging.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
832 NOT_PRODUCT(void print_finger();)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
833
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
834 void print_summary_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
835
1019
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
836 void print_worker_threads_on(outputStream* st) const;
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
837
9076
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8788
diff changeset
838 void print_on_error(outputStream* st) const;
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8788
diff changeset
839
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
840 // The following indicate whether a given verbose level has been
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
841 // set. Notice that anything above stats is conditional to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
842 // _MARKING_VERBOSE_ having been set to 1
3776
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
843 bool verbose_stats() {
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
844 return _verbose_level >= stats_verbose;
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
845 }
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
846 bool verbose_low() {
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
847 return _MARKING_VERBOSE_ && _verbose_level >= low_verbose;
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
848 }
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
849 bool verbose_medium() {
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
850 return _MARKING_VERBOSE_ && _verbose_level >= medium_verbose;
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
851 }
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
852 bool verbose_high() {
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
853 return _MARKING_VERBOSE_ && _verbose_level >= high_verbose;
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
854 }
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
855
6812
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
856 // Liveness counting
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
857
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
858 // Utility routine to set an exclusive range of cards on the given
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
859 // card liveness bitmap
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
860 inline void set_card_bitmap_range(BitMap* card_bm,
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
861 BitMap::idx_t start_idx,
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
862 BitMap::idx_t end_idx,
988bf00cc564 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 6197
diff changeset
863 bool is_par);
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
864
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
865 // 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
866 // Used in biasing indices into accounting card bitmaps.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
867 intptr_t heap_bottom_card_num() const {
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
868 return _heap_bottom_card_num;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
869 }
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
870
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
871 // 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
872 BitMap* count_card_bitmap_for(uint worker_id) {
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
873 assert(0 <= worker_id && worker_id < _max_worker_id, "oob");
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
874 assert(_count_card_bitmaps != NULL, "uninitialized");
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
875 BitMap* task_card_bm = &_count_card_bitmaps[worker_id];
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
876 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
877 return task_card_bm;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
878 }
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
879
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
880 // 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
881 // for the given worker or task id.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
882 size_t* count_marked_bytes_array_for(uint worker_id) {
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
883 assert(0 <= worker_id && worker_id < _max_worker_id, "oob");
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
884 assert(_count_marked_bytes != NULL, "uninitialized");
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
885 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
886 assert(marked_bytes_array != NULL, "uninitialized");
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
887 return marked_bytes_array;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
888 }
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
889
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
890 // 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
891 // for the given address
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
892 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
893
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
894 // 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
895 // marked_bytes array slot for the given HeapRegion.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
896 // 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
897 // cards that are spanned by the memory region.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
898 inline void count_region(MemRegion mr, HeapRegion* hr,
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
899 size_t* marked_bytes_array,
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
900 BitMap* task_card_bm);
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
901
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
902 // 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
903 // data structures for the given worker id.
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
904 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
905
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
906 // 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
907 // data structures for the given worker id.
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
908 inline void count_region(MemRegion mr, uint worker_id);
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
909
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
910 // 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
911 // data structures.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
912 inline void count_object(oop obj, HeapRegion* hr,
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
913 size_t* marked_bytes_array,
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
914 BitMap* task_card_bm);
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
915
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
916 // 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
917 // structures for the given worker id.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
918 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
919
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
920 // 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
921 // the object in the given task/worker counting structures.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
922 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
923 size_t* marked_bytes_array,
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
924 BitMap* task_card_bm);
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
925
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
926 // 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
927 // 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
928 // given worker id.
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
929 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
930 HeapRegion* hr, uint worker_id);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
931
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
932 // 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
933 // 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
934 // given worker id.
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
935 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
936
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
937 // 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
938 // 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
939 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
940
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
941 // 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
942 // 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
943 // 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
944 // 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
945 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
946
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
947 // Unconditionally mark the given object, and unconditinally count
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
948 // 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
949 // Should *not* be called from parallel code.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
950 inline bool mark_and_count(oop obj, HeapRegion* hr);
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
951
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
952 // 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
953 // 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
954 // Should *not* be called from parallel code.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
955 inline bool mark_and_count(oop obj);
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
956
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
957 // Returns true if initialization was successfully completed.
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
958 bool completed_initialization() const {
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
959 return _completed_initialization;
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
960 }
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 6862
diff changeset
961
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
962 protected:
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
963 // 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
964 // counting data.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
965 void clear_all_count_data();
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
966
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
967 // Aggregates the counting data for each worker/task
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
968 // that was constructed while marking. Also sets
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
969 // the amount of marked bytes for each region and
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
970 // the top at concurrent mark count.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
971 void aggregate_count_data();
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
972
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
973 // Verification routine
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
974 void verify_count_data();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
975 };
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 // A class representing a marking task.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
978 class CMTask : public TerminatorTerminator {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
979 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
980 enum PrivateConstants {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
981 // the regular clock call is called once the scanned words reaches
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
982 // this limit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
983 words_scanned_period = 12*1024,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
984 // the regular clock call is called once the number of visited
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985 // references reaches this limit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986 refs_reached_period = 384,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
987 // 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
988 init_hash_seed = 17,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
989 // how many entries will be transferred between global stack and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
990 // local queues
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
991 global_stack_transfer_size = 16
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
992 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
994 uint _worker_id;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
995 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
996 ConcurrentMark* _cm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
997 CMBitMap* _nextMarkBitMap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
998 // the task queue of this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
999 CMTaskQueue* _task_queue;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 579
diff changeset
1000 private:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1001 // the task queue set---needed for stealing
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1002 CMTaskQueueSet* _task_queues;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1003 // indicates whether the task has been claimed---this is only for
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1004 // debugging purposes
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1005 bool _claimed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1006
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1007 // number of calls to this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1008 int _calls;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1009
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1010 // when the virtual timer reaches this time, the marking step should
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1011 // exit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1012 double _time_target_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1013 // the start time of the current marking step
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1014 double _start_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1015
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1016 // the oop closure used for iterations over oops
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1017 G1CMOopClosure* _cm_oop_closure;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1018
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1019 // 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
1020 HeapRegion* _curr_region;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1021 // 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
1022 HeapWord* _finger;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1023 // 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
1024 HeapWord* _region_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1025
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1026 // the number of words this task has scanned
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1027 size_t _words_scanned;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1028 // When _words_scanned reaches this limit, the regular clock is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1029 // called. Notice that this might be decreased under certain
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1030 // circumstances (i.e. when we believe that we did an expensive
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1031 // operation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1032 size_t _words_scanned_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1033 // 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
1034 // before it was decreased).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1035 size_t _real_words_scanned_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1036
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1037 // the number of references this task has visited
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1038 size_t _refs_reached;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1039 // When _refs_reached reaches this limit, the regular clock is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1040 // called. Notice this this might be decreased under certain
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1041 // circumstances (i.e. when we believe that we did an expensive
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1042 // operation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1043 size_t _refs_reached_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1044 // 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
1045 // it was decreased).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1046 size_t _real_refs_reached_limit;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1047
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1048 // used by the work stealing stuff
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1049 int _hash_seed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1050 // 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
1051 bool _has_aborted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1052 // 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
1053 bool _has_timed_out;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1054 // true when we're draining SATB buffers; this avoids the task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1055 // aborting due to SATB buffers being available (as we're already
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1056 // dealing with them)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1057 bool _draining_satb_buffers;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1058
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1059 // number sequence of past step times
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1060 NumberSeq _step_times_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1061 // elapsed time of this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1062 double _elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1063 // termination time of this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1064 double _termination_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1065 // when this task got into the termination protocol
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1066 double _termination_start_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1067
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1068 // 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
1069 // 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
1070 // 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
1071 // phase, i.e. SATB buffer availability...)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1072 bool _concurrent;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1073
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1074 TruncatedSeq _marking_step_diffs_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1075
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
1076 // 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
1077 // 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
1078 // the ConcurrentMark object.
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
1079 size_t* _marked_bytes_array;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
1080 BitMap* _card_bm;
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
1081
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1082 // LOTS of statistics related with this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1083 #if _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1084 NumberSeq _all_clock_intervals_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1085 double _interval_start_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1086
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1087 int _aborted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1088 int _aborted_overflow;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1089 int _aborted_cm_aborted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1090 int _aborted_yield;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1091 int _aborted_timed_out;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1092 int _aborted_satb;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1093 int _aborted_termination;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1094
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1095 int _steal_attempts;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1096 int _steals;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1097
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1098 int _clock_due_to_marking;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1099 int _clock_due_to_scanning;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1100
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1101 int _local_pushes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1102 int _local_pops;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1103 int _local_max_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1104 int _objs_scanned;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1105
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1106 int _global_pushes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1107 int _global_pops;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1108 int _global_max_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1109
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1110 int _global_transfers_to;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1111 int _global_transfers_from;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1112
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1113 int _regions_claimed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1114 int _objs_found_on_bitmap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1115
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1116 int _satb_buffers_processed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1117 #endif // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1118
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1119 // it updates the local fields after this task has claimed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1120 // a new region to scan
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1121 void setup_for_region(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1122 // it brings up-to-date the limit of the region
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1123 void update_region_limit();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1124
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1125 // called when either the words scanned or the refs visited limit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1126 // has been reached
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1127 void reached_limit();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1128 // recalculates the words scanned and refs visited limits
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1129 void recalculate_limits();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1130 // decreases the words scanned and refs visited limits when we reach
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1131 // an expensive operation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1132 void decrease_limits();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1133 // it checks whether the words scanned or refs visited reached their
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1134 // respective limit and calls reached_limit() if they have
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1135 void check_limits() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1136 if (_words_scanned >= _words_scanned_limit ||
3776
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
1137 _refs_reached >= _refs_reached_limit) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1138 reached_limit();
3776
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3772
diff changeset
1139 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1140 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1141 // 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
1142 // 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
1143 // to abort
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1144 void regular_clock_call();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1145 bool concurrent() { return _concurrent; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1146
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1147 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1148 // 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
1149 // a marking phase.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1150 void reset(CMBitMap* _nextMarkBitMap);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1151 // it clears all the fields that correspond to a claimed region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1152 void clear_region_fields();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1153
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1154 void set_concurrent(bool concurrent) { _concurrent = concurrent; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1155
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1156 // The main method of this class which performs a marking step
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1157 // trying not to exceed the given duration. However, it might exit
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1158 // prematurely, according to some conditions (i.e. SATB buffers are
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1159 // available for processing).
8787
fa08949fe0cb 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 8733
diff changeset
1160 void do_marking_step(double target_ms,
fa08949fe0cb 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 8733
diff changeset
1161 bool do_termination,
fa08949fe0cb 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 8733
diff changeset
1162 bool is_serial);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1163
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1164 // These two calls start and stop the timer
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1165 void record_start_time() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1166 _elapsed_time_ms = os::elapsedTime() * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1167 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1168 void record_end_time() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1169 _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1170 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1171
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
1172 // returns the worker ID associated with this task.
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
1173 uint worker_id() { return _worker_id; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1174
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1175 // From TerminatorTerminator. It determines whether this task should
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1176 // exit the termination protocol after it's entered it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1177 virtual bool should_exit_termination();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1178
3378
69293e516993 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 3316
diff changeset
1179 // 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
1180 // 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
1181 // being evacuated.
69293e516993 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 3316
diff changeset
1182 void giveup_current_region();
69293e516993 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 3316
diff changeset
1183
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1184 HeapWord* finger() { return _finger; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1185
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1186 bool has_aborted() { return _has_aborted; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1187 void set_has_aborted() { _has_aborted = true; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1188 void clear_has_aborted() { _has_aborted = false; }
2174
234761c55641 6608385: G1: need to support parallel reference processing
johnc
parents: 2152
diff changeset
1189 bool has_timed_out() { return _has_timed_out; }
234761c55641 6608385: G1: need to support parallel reference processing
johnc
parents: 2152
diff changeset
1190 bool claimed() { return _claimed; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1191
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1192 void set_cm_oop_closure(G1CMOopClosure* cm_oop_closure);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1193
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1194 // 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
1195 // on the local queue
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1196 inline void deal_with_reference(oop obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1197
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1198 // It scans an object and visits its children.
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1199 void scan_object(oop obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1200
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1201 // It pushes an object on the local queue.
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3378
diff changeset
1202 inline void push(oop obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1203
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1204 // These two move entries to/from the global stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1205 void move_entries_to_global_stack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1206 void get_entries_from_global_stack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1207
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1208 // 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
1209 // 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
1210 // partially is false, then it stops when the queue is empty.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1211 void drain_local_queue(bool partially);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1212 // 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
1213 // 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
1214 // 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
1215 // partially if false, it tries to empty them totally.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1216 void drain_global_stack(bool partially);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1217 // It keeps picking SATB buffers and processing them until no SATB
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1218 // buffers are available.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1219 void drain_satb_buffers();
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4728
diff changeset
1220
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1221 // moves the local finger to a new location
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1222 inline void move_finger_to(HeapWord* new_finger) {
1023
11d4857fe5e1 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 1019
diff changeset
1223 assert(new_finger >= _finger && new_finger < _region_limit, "invariant");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1224 _finger = new_finger;
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
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6812
diff changeset
1227 CMTask(uint worker_id, ConcurrentMark *cm,
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4828
diff changeset
1228 size_t* marked_bytes, BitMap* card_bm,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1229 CMTaskQueue* task_queue, CMTaskQueueSet* task_queues);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1230
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1231 // it prints statistics associated with this task
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1232 void print_stats();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1233
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1234 #if _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1235 void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1236 #endif // _MARKING_STATS_
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1237 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
1238
2435
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1239 // 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
1240 // 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
1241 // 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
1242 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
1243 private:
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1244 outputStream* _out;
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1245
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1246 // 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
1247 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
1248 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
1249 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
1250 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
1251
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1252 // 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
1253 // (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
1254 // 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
1255 // 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
1256 // 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
1257 // 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
1258 // 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
1259 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
1260 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
1261 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
1262 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
1263
10290
05a17f270c7e 8014240: G1: Add remembered set size information to output of G1PrintRegionLivenessInfo
tschatzl
parents: 9076
diff changeset
1264 // Accumulator for the remembered set size
05a17f270c7e 8014240: G1: Add remembered set size information to output of G1PrintRegionLivenessInfo
tschatzl
parents: 9076
diff changeset
1265 size_t _total_remset_bytes;
05a17f270c7e 8014240: G1: Add remembered set size information to output of G1PrintRegionLivenessInfo
tschatzl
parents: 9076
diff changeset
1266
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10405
diff changeset
1267 // Accumulator for strong code roots memory size
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10405
diff changeset
1268 size_t _total_strong_code_roots_bytes;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10405
diff changeset
1269
2435
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1270 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
1271 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
1272 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
1273 } else {
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1274 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
1275 }
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1276 }
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1277
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1278 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
1279 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
1280 }
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1281
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1282 // 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
1283 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
1284 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
1285 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
1286
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1287 public:
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1288 // 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
1289 // destructor respectively.
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1290 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
1291 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
1292 ~G1PrintRegionLivenessInfoClosure();
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1293 };
371bbc844bf1 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 2174
diff changeset
1294
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1835
diff changeset
1295 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP