Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/shared/markSweep.hpp @ 452:00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery.
Reviewed-by: apetrusenko, jcoomes
author | ysr |
---|---|
date | Thu, 20 Nov 2008 12:27:41 -0800 |
parents | d1605aabd0a1 |
children | 8b46c4d82093 148e5441d916 |
rev | line source |
---|---|
0 | 1 /* |
196 | 2 * Copyright 1997-2008 Sun Microsystems, Inc. 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 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
22 * | |
23 */ | |
24 | |
25 class ReferenceProcessor; | |
26 | |
27 // MarkSweep takes care of global mark-compact garbage collection for a | |
28 // GenCollectedHeap using a four-phase pointer forwarding algorithm. All | |
29 // generations are assumed to support marking; those that can also support | |
30 // compaction. | |
31 // | |
32 // Class unloading will only occur when a full gc is invoked. | |
33 | |
34 // If VALIDATE_MARK_SWEEP is defined, the -XX:+ValidateMarkSweep flag will | |
35 // be operational, and will provide slow but comprehensive self-checks within | |
36 // the GC. This is not enabled by default in product or release builds, | |
37 // since the extra call to track_adjusted_pointer() in _adjust_pointer() | |
38 // would be too much overhead, and would disturb performance measurement. | |
39 // However, debug builds are sometimes way too slow to run GC tests! | |
40 #ifdef ASSERT | |
41 #define VALIDATE_MARK_SWEEP 1 | |
42 #endif | |
43 #ifdef VALIDATE_MARK_SWEEP | |
44 #define VALIDATE_MARK_SWEEP_ONLY(code) code | |
45 #else | |
46 #define VALIDATE_MARK_SWEEP_ONLY(code) | |
47 #endif | |
48 | |
49 // declared at end | |
50 class PreservedMark; | |
51 | |
52 class MarkSweep : AllStatic { | |
53 // | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
54 // Inline closure decls |
0 | 55 // |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
56 class FollowRootClosure: public OopsInGenClosure { |
0 | 57 public: |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
58 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
|
59 virtual void do_oop(narrowOop* p); |
0 | 60 virtual const bool do_nmethods() const { return true; } |
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); |
0 | 67 virtual const bool do_nmethods() const { return true; } |
68 }; | |
69 | |
70 class FollowStackClosure: public VoidClosure { | |
71 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
72 virtual void do_void(); |
0 | 73 }; |
74 | |
75 class AdjustPointerClosure: public OopsInGenClosure { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
76 private: |
0 | 77 bool _is_root; |
78 public: | |
79 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
|
80 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
|
81 virtual void do_oop(narrowOop* p); |
0 | 82 }; |
83 | |
84 // Used for java/lang/ref handling | |
85 class IsAliveClosure: public BoolObjectClosure { | |
86 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
87 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
|
88 virtual bool do_object_b(oop p); |
0 | 89 }; |
90 | |
91 class KeepAliveClosure: public OopClosure { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
92 protected: |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
93 template <class T> void do_oop_work(T* p); |
0 | 94 public: |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
95 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
|
96 virtual void do_oop(narrowOop* p); |
0 | 97 }; |
98 | |
99 // | |
100 // Friend decls | |
101 // | |
102 friend class AdjustPointerClosure; | |
103 friend class KeepAliveClosure; | |
104 friend class VM_MarkSweep; | |
105 friend void marksweep_init(); | |
106 | |
107 // | |
108 // Vars | |
109 // | |
110 protected: | |
111 // Traversal stack used during phase1 | |
112 static GrowableArray<oop>* _marking_stack; | |
113 // Stack for live klasses to revisit at end of marking phase | |
114 static GrowableArray<Klass*>* _revisit_klass_stack; | |
115 | |
116 // Space for storing/restoring mark word | |
117 static GrowableArray<markOop>* _preserved_mark_stack; | |
118 static GrowableArray<oop>* _preserved_oop_stack; | |
119 static size_t _preserved_count; | |
120 static size_t _preserved_count_max; | |
121 static PreservedMark* _preserved_marks; | |
122 | |
123 // Reference processing (used in ...follow_contents) | |
124 static ReferenceProcessor* _ref_processor; | |
125 | |
126 #ifdef VALIDATE_MARK_SWEEP | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
127 static GrowableArray<void*>* _root_refs_stack; |
0 | 128 static GrowableArray<oop> * _live_oops; |
129 static GrowableArray<oop> * _live_oops_moved_to; | |
130 static GrowableArray<size_t>* _live_oops_size; | |
131 static size_t _live_oops_index; | |
132 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
|
133 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
|
134 static GrowableArray<void*>* _adjusted_pointers; |
0 | 135 static bool _pointer_tracking; |
136 static bool _root_tracking; | |
137 | |
138 // The following arrays are saved since the time of the last GC and | |
139 // assist in tracking down problems where someone has done an errant | |
140 // store into the heap, usually to an oop that wasn't properly | |
141 // handleized across a GC. If we crash or otherwise fail before the | |
142 // next GC, we can query these arrays to find out the object we had | |
143 // intended to do the store to (assuming it is still alive) and the | |
144 // offset within that object. Covered under RecordMarkSweepCompaction. | |
145 static GrowableArray<HeapWord*> * _cur_gc_live_oops; | |
146 static GrowableArray<HeapWord*> * _cur_gc_live_oops_moved_to; | |
147 static GrowableArray<size_t>* _cur_gc_live_oops_size; | |
148 static GrowableArray<HeapWord*> * _last_gc_live_oops; | |
149 static GrowableArray<HeapWord*> * _last_gc_live_oops_moved_to; | |
150 static GrowableArray<size_t>* _last_gc_live_oops_size; | |
151 #endif | |
152 | |
153 // Non public closures | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
154 static IsAliveClosure is_alive; |
0 | 155 static KeepAliveClosure keep_alive; |
156 | |
157 // Class unloading. Update subklass/sibling/implementor links at end of marking phase. | |
158 static void follow_weak_klass_links(); | |
159 | |
160 // Debugging | |
161 static void trace(const char* msg) PRODUCT_RETURN; | |
162 | |
163 public: | |
164 // Public closures | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
165 static FollowRootClosure follow_root_closure; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
166 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
|
167 static FollowStackClosure follow_stack_closure; |
0 | 168 static AdjustPointerClosure adjust_root_pointer_closure; |
169 static AdjustPointerClosure adjust_pointer_closure; | |
170 | |
171 // Reference Processing | |
172 static ReferenceProcessor* const ref_processor() { return _ref_processor; } | |
173 | |
174 // Call backs for marking | |
175 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
|
176 // 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
|
177 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
|
178 // Mark pointer and follow contents. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
179 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
|
180 // 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
|
181 template <class T> static inline void mark_and_push(T* p); |
0 | 182 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
183 static void follow_stack(); // Empty marking stack. |
0 | 184 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
185 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
|
186 // 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
|
187 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
|
188 static void restore_marks(); // Restore the marks that we saved in preserve_mark |
0 | 189 |
113
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 adjust_pointer(T* p, bool isroot); |
0 | 191 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
192 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
|
193 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
|
194 static void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); } |
0 | 195 |
196 #ifdef VALIDATE_MARK_SWEEP | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
197 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
|
198 static void check_adjust_pointer(void* p); |
0 | 199 static void track_interior_pointers(oop obj); |
200 static void check_interior_pointers(); | |
201 | |
202 static void reset_live_oop_tracking(bool at_perm); | |
203 static void register_live_oop(oop p, size_t size); | |
204 static void validate_live_oop(oop p, size_t size); | |
205 static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top); | |
206 static void compaction_complete(); | |
207 | |
208 // Querying operation of RecordMarkSweepCompaction results. | |
209 // Finds and prints the current base oop and offset for a word | |
210 // within an oop that was live during the last GC. Helpful for | |
211 // tracking down heap stomps. | |
212 static void print_new_location_of_heap_address(HeapWord* q); | |
213 #endif | |
214 | |
215 // Call backs for class unloading | |
216 static void revisit_weak_klass_link(Klass* k); // Update subklass/sibling/implementor links at end of marking. | |
217 }; | |
218 | |
219 class PreservedMark VALUE_OBJ_CLASS_SPEC { | |
220 private: | |
221 oop _obj; | |
222 markOop _mark; | |
223 | |
224 public: | |
225 void init(oop obj, markOop mark) { | |
226 _obj = obj; | |
227 _mark = mark; | |
228 } | |
229 | |
230 void adjust_pointer() { | |
231 MarkSweep::adjust_pointer(&_obj); | |
232 } | |
233 | |
234 void restore() { | |
235 _obj->set_mark(_mark); | |
236 } | |
237 }; |