annotate src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp @ 3979:4dfb2df418f2

6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author johnc
date Thu, 22 Sep 2011 10:57:37 -0700
parents 23d434c6290d
children 2ace1c4ee8da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
1 /*
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
4 *
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
7 * published by the Free Software Foundation.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
8 *
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
13 * accompanied this code).
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
14 *
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
18 *
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
21 * questions.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
22 *
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
23 */
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
24
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
27
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
28 #include "gc_implementation/g1/concurrentMark.hpp"
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
30
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
31 inline void CMTask::push(oop obj) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
32 HeapWord* objAddr = (HeapWord*) obj;
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
33 assert(_g1h->is_in_g1_reserved(objAddr), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
34 assert(!_g1h->is_on_master_free_list(
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
35 _g1h->heap_region_containing((HeapWord*) objAddr)), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
36 assert(!_g1h->is_obj_ill(obj), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
37 assert(_nextMarkBitMap->isMarked(objAddr), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
38
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
39 if (_cm->verbose_high()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
40 gclog_or_tty->print_cr("[%d] pushing "PTR_FORMAT, _task_id, (void*) obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
41 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
42
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
43 if (!_task_queue->push(obj)) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
44 // The local task queue looks full. We need to push some entries
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
45 // to the global stack.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
46
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
47 if (_cm->verbose_medium()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
48 gclog_or_tty->print_cr("[%d] task queue overflow, "
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
49 "moving entries to the global stack",
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
50 _task_id);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
51 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
52 move_entries_to_global_stack();
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
53
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
54 // this should succeed since, even if we overflow the global
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
55 // stack, we should have definitely removed some entries from the
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
56 // local queue. So, there must be space on it.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
57 bool success = _task_queue->push(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
58 assert(success, "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
59 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
60
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
61 statsOnly( int tmp_size = _task_queue->size();
3776
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3771
diff changeset
62 if (tmp_size > _local_max_size) {
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
63 _local_max_size = tmp_size;
3776
23d434c6290d 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 3771
diff changeset
64 }
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
65 ++_local_pushes );
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
66 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
67
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
68 // This determines whether the method below will check both the local
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
69 // and global fingers when determining whether to push on the stack a
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
70 // gray object (value 1) or whether it will only check the global one
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
71 // (value 0). The tradeoffs are that the former will be a bit more
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
72 // accurate and possibly push less on the stack, but it might also be
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
73 // a little bit slower.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
74
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
75 #define _CHECK_BOTH_FINGERS_ 1
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
76
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
77 inline void CMTask::deal_with_reference(oop obj) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
78 if (_cm->verbose_high()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
79 gclog_or_tty->print_cr("[%d] we're dealing with reference = "PTR_FORMAT,
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
80 _task_id, (void*) obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
81 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
82
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
83 ++_refs_reached;
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
84
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
85 HeapWord* objAddr = (HeapWord*) obj;
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
86 assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
87 if (_g1h->is_in_g1_reserved(objAddr)) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
88 assert(obj != NULL, "null check is implicit");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
89 if (!_nextMarkBitMap->isMarked(objAddr)) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
90 // Only get the containing region if the object is not marked on the
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
91 // bitmap (otherwise, it's a waste of time since we won't do
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
92 // anything with it).
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
93 HeapRegion* hr = _g1h->heap_region_containing_raw(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
94 if (!hr->obj_allocated_since_next_marking(obj)) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
95 if (_cm->verbose_high()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
96 gclog_or_tty->print_cr("[%d] "PTR_FORMAT" is not considered marked",
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
97 _task_id, (void*) obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
98 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
99
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
100 // we need to mark it first
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
101 if (_nextMarkBitMap->parMark(objAddr)) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
102 // No OrderAccess:store_load() is needed. It is implicit in the
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
103 // CAS done in parMark(objAddr) above
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
104 HeapWord* global_finger = _cm->finger();
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
105
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
106 #if _CHECK_BOTH_FINGERS_
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
107 // we will check both the local and global fingers
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
108
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
109 if (_finger != NULL && objAddr < _finger) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
110 if (_cm->verbose_high()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
111 gclog_or_tty->print_cr("[%d] below the local finger ("PTR_FORMAT"), "
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
112 "pushing it", _task_id, _finger);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
113 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
114 push(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
115 } else if (_curr_region != NULL && objAddr < _region_limit) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
116 // do nothing
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
117 } else if (objAddr < global_finger) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
118 // Notice that the global finger might be moving forward
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
119 // concurrently. This is not a problem. In the worst case, we
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
120 // mark the object while it is above the global finger and, by
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
121 // the time we read the global finger, it has moved forward
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
122 // passed this object. In this case, the object will probably
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
123 // be visited when a task is scanning the region and will also
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
124 // be pushed on the stack. So, some duplicate work, but no
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
125 // correctness problems.
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
126
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
127 if (_cm->verbose_high()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
128 gclog_or_tty->print_cr("[%d] below the global finger "
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
129 "("PTR_FORMAT"), pushing it",
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
130 _task_id, global_finger);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
131 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
132 push(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
133 } else {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
134 // do nothing
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
135 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
136 #else // _CHECK_BOTH_FINGERS_
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
137 // we will only check the global finger
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
138
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
139 if (objAddr < global_finger) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
140 // see long comment above
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
141
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
142 if (_cm->verbose_high()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
143 gclog_or_tty->print_cr("[%d] below the global finger "
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
144 "("PTR_FORMAT"), pushing it",
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
145 _task_id, global_finger);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
146 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
147 push(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
148 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
149 #endif // _CHECK_BOTH_FINGERS_
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
150 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
151 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
152 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
153 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
154 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
155
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
156 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP