Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/shared/markSweep.hpp @ 1842:6e0aac35bfa9
6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
Summary: Under certain circumstances a safepoint could happen between a JavaThread object being created and that object being added to the Java threads list. This could cause the active field of that thread's SATB queue to get out-of-sync with respect to the other Java threads. The solution is to activate the SATB queue, when necessary, before adding the thread to the Java threads list, not when the JavaThread object is created. The changeset also includes a small fix to rename the surrogate locker thread from "Surrogate Locker Thread (CMS)" to "Surrogate Locker Thread (Concurrent GC)" since it's also used in G1.
Reviewed-by: iveresov, ysr, johnc, jcoomes
author | tonyp |
---|---|
date | Fri, 01 Oct 2010 16:43:05 -0400 |
parents | 894b1d7c7e01 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1311
diff
changeset
|
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1311
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1311
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:
1311
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 class ReferenceProcessor; | |
941 | 26 class DataLayout; |
0 | 27 |
28 // MarkSweep takes care of global mark-compact garbage collection for a | |
29 // GenCollectedHeap using a four-phase pointer forwarding algorithm. All | |
30 // generations are assumed to support marking; those that can also support | |
31 // compaction. | |
32 // | |
33 // Class unloading will only occur when a full gc is invoked. | |
34 | |
35 // If VALIDATE_MARK_SWEEP is defined, the -XX:+ValidateMarkSweep flag will | |
36 // be operational, and will provide slow but comprehensive self-checks within | |
37 // the GC. This is not enabled by default in product or release builds, | |
38 // since the extra call to track_adjusted_pointer() in _adjust_pointer() | |
39 // would be too much overhead, and would disturb performance measurement. | |
40 // However, debug builds are sometimes way too slow to run GC tests! | |
41 #ifdef ASSERT | |
42 #define VALIDATE_MARK_SWEEP 1 | |
43 #endif | |
44 #ifdef VALIDATE_MARK_SWEEP | |
45 #define VALIDATE_MARK_SWEEP_ONLY(code) code | |
46 #else | |
47 #define VALIDATE_MARK_SWEEP_ONLY(code) | |
48 #endif | |
49 | |
50 // declared at end | |
51 class PreservedMark; | |
52 | |
53 class MarkSweep : AllStatic { | |
54 // | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
55 // Inline closure decls |
0 | 56 // |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
57 class FollowRootClosure: public OopsInGenClosure { |
0 | 58 public: |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
59 virtual void do_oop(oop* p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
60 virtual void do_oop(narrowOop* p); |
0 | 61 }; |
62 | |
63 class MarkAndPushClosure: public OopClosure { | |
64 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
65 virtual void do_oop(oop* p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
66 virtual void do_oop(narrowOop* p); |
941 | 67 virtual const bool should_remember_mdo() const { return true; } |
68 virtual void remember_mdo(DataLayout* p) { MarkSweep::revisit_mdo(p); } | |
0 | 69 }; |
70 | |
71 class FollowStackClosure: public VoidClosure { | |
72 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
73 virtual void do_void(); |
0 | 74 }; |
75 | |
76 class AdjustPointerClosure: public OopsInGenClosure { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
77 private: |
0 | 78 bool _is_root; |
79 public: | |
80 AdjustPointerClosure(bool is_root) : _is_root(is_root) {} | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
81 virtual void do_oop(oop* p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
82 virtual void do_oop(narrowOop* p); |
0 | 83 }; |
84 | |
85 // Used for java/lang/ref handling | |
86 class IsAliveClosure: public BoolObjectClosure { | |
87 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
88 virtual void do_object(oop p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
89 virtual bool do_object_b(oop p); |
0 | 90 }; |
91 | |
92 class KeepAliveClosure: public OopClosure { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
93 protected: |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
94 template <class T> void do_oop_work(T* p); |
0 | 95 public: |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
96 virtual void do_oop(oop* p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
97 virtual void do_oop(narrowOop* p); |
0 | 98 }; |
99 | |
100 // | |
101 // Friend decls | |
102 // | |
103 friend class AdjustPointerClosure; | |
104 friend class KeepAliveClosure; | |
105 friend class VM_MarkSweep; | |
106 friend void marksweep_init(); | |
107 | |
108 // | |
109 // Vars | |
110 // | |
111 protected: | |
1311
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
112 // Traversal stacks used during phase1 |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
113 static Stack<oop> _marking_stack; |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
114 static Stack<ObjArrayTask> _objarray_stack; |
0 | 115 // Stack for live klasses to revisit at end of marking phase |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
116 static Stack<Klass*> _revisit_klass_stack; |
941 | 117 // Set (stack) of MDO's to revisit at end of marking phase |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
118 static Stack<DataLayout*> _revisit_mdo_stack; |
0 | 119 |
120 // Space for storing/restoring mark word | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
121 static Stack<markOop> _preserved_mark_stack; |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
122 static Stack<oop> _preserved_oop_stack; |
0 | 123 static size_t _preserved_count; |
124 static size_t _preserved_count_max; | |
125 static PreservedMark* _preserved_marks; | |
126 | |
127 // Reference processing (used in ...follow_contents) | |
128 static ReferenceProcessor* _ref_processor; | |
129 | |
130 #ifdef VALIDATE_MARK_SWEEP | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
131 static GrowableArray<void*>* _root_refs_stack; |
0 | 132 static GrowableArray<oop> * _live_oops; |
133 static GrowableArray<oop> * _live_oops_moved_to; | |
134 static GrowableArray<size_t>* _live_oops_size; | |
135 static size_t _live_oops_index; | |
136 static size_t _live_oops_index_at_perm; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
137 static GrowableArray<void*>* _other_refs_stack; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
138 static GrowableArray<void*>* _adjusted_pointers; |
0 | 139 static bool _pointer_tracking; |
140 static bool _root_tracking; | |
141 | |
142 // The following arrays are saved since the time of the last GC and | |
143 // assist in tracking down problems where someone has done an errant | |
144 // store into the heap, usually to an oop that wasn't properly | |
145 // handleized across a GC. If we crash or otherwise fail before the | |
146 // next GC, we can query these arrays to find out the object we had | |
147 // intended to do the store to (assuming it is still alive) and the | |
148 // offset within that object. Covered under RecordMarkSweepCompaction. | |
149 static GrowableArray<HeapWord*> * _cur_gc_live_oops; | |
150 static GrowableArray<HeapWord*> * _cur_gc_live_oops_moved_to; | |
151 static GrowableArray<size_t>* _cur_gc_live_oops_size; | |
152 static GrowableArray<HeapWord*> * _last_gc_live_oops; | |
153 static GrowableArray<HeapWord*> * _last_gc_live_oops_moved_to; | |
154 static GrowableArray<size_t>* _last_gc_live_oops_size; | |
155 #endif | |
156 | |
157 // Non public closures | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
158 static IsAliveClosure is_alive; |
0 | 159 static KeepAliveClosure keep_alive; |
160 | |
161 // Class unloading. Update subklass/sibling/implementor links at end of marking phase. | |
162 static void follow_weak_klass_links(); | |
163 | |
941 | 164 // Class unloading. Clear weak refs in MDO's (ProfileData) |
165 // at the end of the marking phase. | |
166 static void follow_mdo_weak_refs(); | |
167 | |
0 | 168 // Debugging |
169 static void trace(const char* msg) PRODUCT_RETURN; | |
170 | |
171 public: | |
172 // Public closures | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
173 static FollowRootClosure follow_root_closure; |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
174 static CodeBlobToOopClosure follow_code_root_closure; // => follow_root_closure |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
175 static MarkAndPushClosure mark_and_push_closure; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
176 static FollowStackClosure follow_stack_closure; |
0 | 177 static AdjustPointerClosure adjust_root_pointer_closure; |
178 static AdjustPointerClosure adjust_pointer_closure; | |
179 | |
180 // Reference Processing | |
181 static ReferenceProcessor* const ref_processor() { return _ref_processor; } | |
182 | |
183 // Call backs for marking | |
184 static void mark_object(oop obj); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
185 // Mark pointer and follow contents. Empty marking stack afterwards. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
186 template <class T> static inline void follow_root(T* p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
187 // Mark pointer and follow contents. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
188 template <class T> static inline void mark_and_follow(T* p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
189 // Check mark and maybe push on marking stack |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
190 template <class T> static inline void mark_and_push(T* p); |
1311
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
191 static inline void push_objarray(oop obj, size_t index); |
0 | 192 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
193 static void follow_stack(); // Empty marking stack. |
0 | 194 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
195 static void preserve_mark(oop p, markOop mark); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
196 // Save the mark word so it can be restored later |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
197 static void adjust_marks(); // Adjust the pointers in the preserved marks table |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
198 static void restore_marks(); // Restore the marks that we saved in preserve_mark |
0 | 199 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
200 template <class T> static inline void adjust_pointer(T* p, bool isroot); |
0 | 201 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
202 static void adjust_root_pointer(oop* p) { adjust_pointer(p, true); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
203 static void adjust_pointer(oop* p) { adjust_pointer(p, false); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
204 static void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); } |
0 | 205 |
206 #ifdef VALIDATE_MARK_SWEEP | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
207 static void track_adjusted_pointer(void* p, bool isroot); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
208 static void check_adjust_pointer(void* p); |
0 | 209 static void track_interior_pointers(oop obj); |
210 static void check_interior_pointers(); | |
211 | |
212 static void reset_live_oop_tracking(bool at_perm); | |
213 static void register_live_oop(oop p, size_t size); | |
214 static void validate_live_oop(oop p, size_t size); | |
215 static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top); | |
216 static void compaction_complete(); | |
217 | |
218 // Querying operation of RecordMarkSweepCompaction results. | |
219 // Finds and prints the current base oop and offset for a word | |
220 // within an oop that was live during the last GC. Helpful for | |
221 // tracking down heap stomps. | |
222 static void print_new_location_of_heap_address(HeapWord* q); | |
223 #endif | |
224 | |
225 // Call backs for class unloading | |
941 | 226 // Update subklass/sibling/implementor links at end of marking. |
227 static void revisit_weak_klass_link(Klass* k); | |
228 // For weak refs clearing in MDO's | |
229 static void revisit_mdo(DataLayout* p); | |
0 | 230 }; |
231 | |
232 class PreservedMark VALUE_OBJ_CLASS_SPEC { | |
233 private: | |
234 oop _obj; | |
235 markOop _mark; | |
236 | |
237 public: | |
238 void init(oop obj, markOop mark) { | |
239 _obj = obj; | |
240 _mark = mark; | |
241 } | |
242 | |
243 void adjust_pointer() { | |
244 MarkSweep::adjust_pointer(&_obj); | |
245 } | |
246 | |
247 void restore() { | |
248 _obj->set_mark(_mark); | |
249 } | |
250 }; |