1 /*
2 * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
27 #include "gc_implementation/g1/satbQueue.hpp"
28 #include "gc_interface/collectedHeap.hpp"
29 #include "memory/allocation.inline.hpp"
30 #include "oops/oop.inline.hpp"
31 #include "runtime/mutexLocker.hpp"
32 #include "runtime/thread.hpp"
33 #include "runtime/vmThread.hpp"
34
35 void ObjPtrQueue::flush() {
36 // The buffer might contain refs into the CSet. We have to filter it
37 // first before we flush it, otherwise we might end up with an
38 // enqueued buffer with refs into the CSet which breaks our invariants.
39 filter();
40 flush_impl();
41 }
42
43 // This method removes entries from an SATB buffer that will not be
44 // useful to the concurrent marking threads. An entry is removed if it
45 // satisfies one of the following conditions:
46 //
47 // * it points to an object outside the G1 heap (G1's concurrent
48 // marking only visits objects inside the G1 heap),
49 // * it points to an object that has been allocated since marking
50 // started (according to SATB those objects do not need to be
51 // visited during marking), or
52 // * it points to an object that has already been marked (no need to
53 // process it again).
54 //
55 // The rest of the entries will be retained and are compacted towards
56 // the top of the buffer. Note that, because we do not allow old
57 // regions in the CSet during marking, all objects on the CSet regions
58 // are young (eden or survivors) and therefore implicitly live. So any
59 // references into the CSet will be removed during filtering.
60
61 void ObjPtrQueue::filter() {
62 G1CollectedHeap* g1h = G1CollectedHeap::heap();
63 void** buf = _buf;
64 size_t sz = _sz;
65
66 if (buf == NULL) {
67 // nothing to do
68 return;
69 }
70
71 // Used for sanity checking at the end of the loop.
72 debug_only(size_t entries = 0; size_t retained = 0;)
73
74 size_t i = sz;
75 size_t new_index = sz;
76
77 while (i > _index) {
78 assert(i > 0, "we should have at least one more entry to process");
79 i -= oopSize;
80 debug_only(entries += 1;)
81 oop* p = (oop*) &buf[byte_index_to_index((int) i)];
82 oop obj = *p;
83 // NULL the entry so that unused parts of the buffer contain NULLs
84 // at the end. If we are going to retain it we will copy it to its
85 // final place. If we have retained all entries we have visited so
86 // far, we'll just end up copying it to the same place.
87 *p = NULL;
88
89 bool retain = g1h->is_obj_ill(obj);
90 if (retain) {
91 assert(new_index > 0, "we should not have already filled up the buffer");
92 new_index -= oopSize;
93 assert(new_index >= i,
94 "new_index should never be below i, as we always compact 'up'");
95 oop* new_p = (oop*) &buf[byte_index_to_index((int) new_index)];
96 assert(new_p >= p, "the destination location should never be below "
97 "the source as we always compact 'up'");
98 assert(*new_p == NULL,
99 "we should have already cleared the destination location");
100 *new_p = obj;
101 debug_only(retained += 1;)
102 }
103 }
104
105 #ifdef ASSERT
106 size_t entries_calc = (sz - _index) / oopSize;
107 assert(entries == entries_calc, "the number of entries we counted "
108 "should match the number of entries we calculated");
109 size_t retained_calc = (sz - new_index) / oopSize;
110 assert(retained == retained_calc, "the number of retained entries we counted "
111 "should match the number of retained entries we calculated");
112 #endif // ASSERT
113
114 _index = new_index;
115 }
116
117 // This method will first apply the above filtering to the buffer. If
118 // post-filtering a large enough chunk of the buffer has been cleared
119 // we can re-use the buffer (instead of enqueueing it) and we can just
120 // allow the mutator to carry on executing using the same buffer
167 cl->do_object(obj);
168 }
169 }
170 }
171
172 #ifndef PRODUCT
173 // Helpful for debugging
174
175 void ObjPtrQueue::print(const char* name) {
176 print(name, _buf, _index, _sz);
177 }
178
179 void ObjPtrQueue::print(const char* name,
180 void** buf, size_t index, size_t sz) {
181 gclog_or_tty->print_cr(" SATB BUFFER [%s] buf: "PTR_FORMAT" "
182 "index: "SIZE_FORMAT" sz: "SIZE_FORMAT,
183 name, p2i(buf), index, sz);
184 }
185 #endif // PRODUCT
186
187 #ifdef ASSERT
188 void ObjPtrQueue::verify_oops_in_buffer() {
189 if (_buf == NULL) return;
190 for (size_t i = _index; i < _sz; i += oopSize) {
191 oop obj = (oop)_buf[byte_index_to_index((int)i)];
192 assert(obj != NULL && obj->is_oop(true /* ignore mark word */),
193 "Not an oop");
194 }
195 }
196 #endif
197
198 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
199 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
200 #endif // _MSC_VER
201
202 SATBMarkQueueSet::SATBMarkQueueSet() :
203 PtrQueueSet(), _closures(NULL),
204 _shared_satb_queue(this, true /*perm*/) { }
205
206 void SATBMarkQueueSet::initialize(Monitor* cbl_mon, Mutex* fl_lock,
207 int process_completed_threshold,
208 Mutex* lock) {
209 PtrQueueSet::initialize(cbl_mon, fl_lock, process_completed_threshold, -1);
210 _shared_satb_queue.set_lock(lock);
211 _closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads, mtGC);
212 }
213
214 void SATBMarkQueueSet::handle_zero_index_for_thread(JavaThread* t) {
215 DEBUG_ONLY(t->satb_mark_queue().verify_oops_in_buffer();)
216 t->satb_mark_queue().handle_zero_index();
217 }
218
219 #ifdef ASSERT
220 void SATBMarkQueueSet::dump_active_states(bool expected_active) {
221 gclog_or_tty->print_cr("Expected SATB active state: %s",
222 expected_active ? "ACTIVE" : "INACTIVE");
223 gclog_or_tty->print_cr("Actual SATB active states:");
224 gclog_or_tty->print_cr(" Queue set: %s", is_active() ? "ACTIVE" : "INACTIVE");
225 for (JavaThread* t = Threads::first(); t; t = t->next()) {
226 gclog_or_tty->print_cr(" Thread \"%s\" queue: %s", t->name(),
227 t->satb_mark_queue().is_active() ? "ACTIVE" : "INACTIVE");
228 }
229 gclog_or_tty->print_cr(" Shared queue: %s",
230 shared_satb_queue()->is_active() ? "ACTIVE" : "INACTIVE");
231 }
232
233 void SATBMarkQueueSet::verify_active_states(bool expected_active) {
234 // Verify queue set state
235 if (is_active() != expected_active) {
|
1 /*
2 * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
27 #include "gc_implementation/g1/satbQueue.hpp"
28 #include "gc_interface/collectedHeap.hpp"
29 #include "memory/allocation.inline.hpp"
30 #include "oops/oop.inline.hpp"
31 #include "runtime/mutexLocker.hpp"
32 #include "runtime/thread.hpp"
33 #include "runtime/vmThread.hpp"
34
35 void ObjPtrQueue::flush() {
36 // Filter now to possibly save work later. If filtering empties the
37 // buffer then flush_impl can deallocate the buffer.
38 filter();
39 flush_impl();
40 }
41
42 // Return true if a SATB buffer entry refers to an object that
43 // requires marking.
44 //
45 // The entry must point into the G1 heap. In particular, it must not
46 // be a NULL pointer. NULL pointers are pre-filtered and never
47 // inserted into a SATB buffer.
48 //
49 // An entry that is below the NTAMS pointer for the containing heap
50 // region requires marking. Such an entry must point to a valid object.
51 //
52 // An entry that is at least the NTAMS pointer for the containing heap
53 // region might be any of the following, none of which should be marked.
54 //
55 // * A reference to an object allocated since marking started.
56 // According to SATB, such objects are implicitly kept live and do
57 // not need to be dealt with via SATB buffer processing.
58 //
59 // * A reference to a young generation object. Young objects are
60 // handled separately and are not marked by concurrent marking.
61 //
62 // * A stale reference to a young generation object. If a young
63 // generation object reference is recorded and not filtered out
64 // before being moved by a young collection, the reference becomes
65 // stale.
66 //
67 // * A stale reference to an eagerly reclaimed humongous object. If a
68 // humongous object is recorded and then reclaimed, the reference
69 // becomes stale.
70 //
71 // The stale reference cases are implicitly handled by the NTAMS
72 // comparison. Because of the possibility of stale references, buffer
73 // processing must be somewhat circumspect and not assume entries
74 // in an unfiltered buffer refer to valid objects.
75
76 inline bool requires_marking(const HeapWord* entry, G1CollectedHeap* heap) {
77 // Includes rejection of NULL pointers.
78 assert(heap->is_in_reserved(entry),
79 err_msg("Non-heap pointer in SATB buffer: " PTR_FORMAT, p2i(entry)));
80
81 HeapRegion* region = heap->heap_region_containing_raw(entry);
82 assert(region != NULL, err_msg("No region for " PTR_FORMAT, p2i(entry)));
83 if (entry >= region->next_top_at_mark_start()) return false;
84
85 // Can obj really have it's mark word set? It's not in young gen...
86 assert(((oop)entry)->is_oop(true /* ignore mark word */),
87 err_msg("Invalid oop in SATB buffer: " PTR_FORMAT, p2i(entry)));
88
89 return true;
90 }
91
92 // This method removes entries from a SATB buffer that will not be
93 // useful to the concurrent marking threads. Entries are retained if
94 // they require marking and are not already marked. Retained entries
95 // are compacted toward the top of the buffer.
96
97 void ObjPtrQueue::filter() {
98 G1CollectedHeap* g1h = G1CollectedHeap::heap();
99 void** buf = _buf;
100 size_t sz = _sz;
101
102 if (buf == NULL) {
103 // nothing to do
104 return;
105 }
106
107 // Used for sanity checking at the end of the loop.
108 debug_only(size_t entries = 0; size_t retained = 0;)
109
110 size_t i = sz;
111 size_t new_index = sz;
112
113 while (i > _index) {
114 assert(i > 0, "we should have at least one more entry to process");
115 i -= oopSize;
116 debug_only(entries += 1;)
117 HeapWord** p = (HeapWord**) &buf[byte_index_to_index((int) i)];
118 HeapWord* entry = *p;
119 // NULL the entry so that unused parts of the buffer contain NULLs
120 // at the end. If we are going to retain it we will copy it to its
121 // final place. If we have retained all entries we have visited so
122 // far, we'll just end up copying it to the same place.
123 *p = NULL;
124
125 if (requires_marking(entry, g1h) && !g1h->isMarkedNext((oop)entry)) {
126 assert(new_index > 0, "we should not have already filled up the buffer");
127 new_index -= oopSize;
128 assert(new_index >= i,
129 "new_index should never be below i, as we always compact 'up'");
130 HeapWord** new_p = (HeapWord**) &buf[byte_index_to_index((int) new_index)];
131 assert(new_p >= p, "the destination location should never be below "
132 "the source as we always compact 'up'");
133 assert(*new_p == NULL,
134 "we should have already cleared the destination location");
135 *new_p = entry;
136 debug_only(retained += 1;)
137 }
138 }
139
140 #ifdef ASSERT
141 size_t entries_calc = (sz - _index) / oopSize;
142 assert(entries == entries_calc, "the number of entries we counted "
143 "should match the number of entries we calculated");
144 size_t retained_calc = (sz - new_index) / oopSize;
145 assert(retained == retained_calc, "the number of retained entries we counted "
146 "should match the number of retained entries we calculated");
147 #endif // ASSERT
148
149 _index = new_index;
150 }
151
152 // This method will first apply the above filtering to the buffer. If
153 // post-filtering a large enough chunk of the buffer has been cleared
154 // we can re-use the buffer (instead of enqueueing it) and we can just
155 // allow the mutator to carry on executing using the same buffer
202 cl->do_object(obj);
203 }
204 }
205 }
206
207 #ifndef PRODUCT
208 // Helpful for debugging
209
210 void ObjPtrQueue::print(const char* name) {
211 print(name, _buf, _index, _sz);
212 }
213
214 void ObjPtrQueue::print(const char* name,
215 void** buf, size_t index, size_t sz) {
216 gclog_or_tty->print_cr(" SATB BUFFER [%s] buf: "PTR_FORMAT" "
217 "index: "SIZE_FORMAT" sz: "SIZE_FORMAT,
218 name, p2i(buf), index, sz);
219 }
220 #endif // PRODUCT
221
222 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
223 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
224 #endif // _MSC_VER
225
226 SATBMarkQueueSet::SATBMarkQueueSet() :
227 PtrQueueSet(), _closures(NULL),
228 _shared_satb_queue(this, true /*perm*/) { }
229
230 void SATBMarkQueueSet::initialize(Monitor* cbl_mon, Mutex* fl_lock,
231 int process_completed_threshold,
232 Mutex* lock) {
233 PtrQueueSet::initialize(cbl_mon, fl_lock, process_completed_threshold, -1);
234 _shared_satb_queue.set_lock(lock);
235 _closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads, mtGC);
236 }
237
238 void SATBMarkQueueSet::handle_zero_index_for_thread(JavaThread* t) {
239 t->satb_mark_queue().handle_zero_index();
240 }
241
242 #ifdef ASSERT
243 void SATBMarkQueueSet::dump_active_states(bool expected_active) {
244 gclog_or_tty->print_cr("Expected SATB active state: %s",
245 expected_active ? "ACTIVE" : "INACTIVE");
246 gclog_or_tty->print_cr("Actual SATB active states:");
247 gclog_or_tty->print_cr(" Queue set: %s", is_active() ? "ACTIVE" : "INACTIVE");
248 for (JavaThread* t = Threads::first(); t; t = t->next()) {
249 gclog_or_tty->print_cr(" Thread \"%s\" queue: %s", t->name(),
250 t->satb_mark_queue().is_active() ? "ACTIVE" : "INACTIVE");
251 }
252 gclog_or_tty->print_cr(" Shared queue: %s",
253 shared_satb_queue()->is_active() ? "ACTIVE" : "INACTIVE");
254 }
255
256 void SATBMarkQueueSet::verify_active_states(bool expected_active) {
257 // Verify queue set state
258 if (is_active() != expected_active) {
|