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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 class ReferenceProcessor;
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
26 class DataLayout;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // MarkSweep takes care of global mark-compact garbage collection for a
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // GenCollectedHeap using a four-phase pointer forwarding algorithm. All
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // generations are assumed to support marking; those that can also support
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
32 //
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // Class unloading will only occur when a full gc is invoked.
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // If VALIDATE_MARK_SWEEP is defined, the -XX:+ValidateMarkSweep flag will
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // be operational, and will provide slow but comprehensive self-checks within
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // the GC. This is not enabled by default in product or release builds,
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // since the extra call to track_adjusted_pointer() in _adjust_pointer()
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // would be too much overhead, and would disturb performance measurement.
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // However, debug builds are sometimes way too slow to run GC tests!
a61af66fc99e Initial load
duke
parents:
diff changeset
41 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
42 #define VALIDATE_MARK_SWEEP 1
a61af66fc99e Initial load
duke
parents:
diff changeset
43 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
44 #ifdef VALIDATE_MARK_SWEEP
a61af66fc99e Initial load
duke
parents:
diff changeset
45 #define VALIDATE_MARK_SWEEP_ONLY(code) code
a61af66fc99e Initial load
duke
parents:
diff changeset
46 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
47 #define VALIDATE_MARK_SWEEP_ONLY(code)
a61af66fc99e Initial load
duke
parents:
diff changeset
48 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // declared at end
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class PreservedMark;
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class MarkSweep : AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
61 };
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 class MarkAndPushClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
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
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
67 virtual const bool should_remember_mdo() const { return true; }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
68 virtual void remember_mdo(DataLayout* p) { MarkSweep::revisit_mdo(p); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
69 };
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 class FollowStackClosure: public VoidClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
74 };
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
78 bool _is_root;
a61af66fc99e Initial load
duke
parents:
diff changeset
79 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
83 };
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // Used for java/lang/ref handling
a61af66fc99e Initial load
duke
parents:
diff changeset
86 class IsAliveClosure: public BoolObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
90 };
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
98 };
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 //
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // Friend decls
a61af66fc99e Initial load
duke
parents:
diff changeset
102 //
a61af66fc99e Initial load
duke
parents:
diff changeset
103 friend class AdjustPointerClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 friend class KeepAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 friend class VM_MarkSweep;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 friend void marksweep_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 //
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Vars
a61af66fc99e Initial load
duke
parents:
diff changeset
110 //
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
123 static size_t _preserved_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 static size_t _preserved_count_max;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 static PreservedMark* _preserved_marks;
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Reference processing (used in ...follow_contents)
a61af66fc99e Initial load
duke
parents:
diff changeset
128 static ReferenceProcessor* _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
132 static GrowableArray<oop> * _live_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 static GrowableArray<oop> * _live_oops_moved_to;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 static GrowableArray<size_t>* _live_oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static size_t _live_oops_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
139 static bool _pointer_tracking;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 static bool _root_tracking;
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // The following arrays are saved since the time of the last GC and
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // assist in tracking down problems where someone has done an errant
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // store into the heap, usually to an oop that wasn't properly
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // handleized across a GC. If we crash or otherwise fail before the
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // next GC, we can query these arrays to find out the object we had
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // intended to do the store to (assuming it is still alive) and the
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // offset within that object. Covered under RecordMarkSweepCompaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
149 static GrowableArray<HeapWord*> * _cur_gc_live_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 static GrowableArray<HeapWord*> * _cur_gc_live_oops_moved_to;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 static GrowableArray<size_t>* _cur_gc_live_oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 static GrowableArray<HeapWord*> * _last_gc_live_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 static GrowableArray<HeapWord*> * _last_gc_live_oops_moved_to;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 static GrowableArray<size_t>* _last_gc_live_oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
159 static KeepAliveClosure keep_alive;
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Class unloading. Update subklass/sibling/implementor links at end of marking phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 static void follow_weak_klass_links();
a61af66fc99e Initial load
duke
parents:
diff changeset
163
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
164 // Class unloading. Clear weak refs in MDO's (ProfileData)
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
165 // at the end of the marking phase.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
166 static void follow_mdo_weak_refs();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
167
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
169 static void trace(const char* msg) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
177 static AdjustPointerClosure adjust_root_pointer_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 static AdjustPointerClosure adjust_pointer_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Reference Processing
a61af66fc99e Initial load
duke
parents:
diff changeset
181 static ReferenceProcessor* const ref_processor() { return _ref_processor; }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Call backs for marking
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
209 static void track_interior_pointers(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 static void check_interior_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 static void reset_live_oop_tracking(bool at_perm);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 static void register_live_oop(oop p, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 static void validate_live_oop(oop p, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 static void compaction_complete();
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Querying operation of RecordMarkSweepCompaction results.
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Finds and prints the current base oop and offset for a word
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // within an oop that was live during the last GC. Helpful for
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // tracking down heap stomps.
a61af66fc99e Initial load
duke
parents:
diff changeset
222 static void print_new_location_of_heap_address(HeapWord* q);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Call backs for class unloading
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
226 // Update subklass/sibling/implementor links at end of marking.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
227 static void revisit_weak_klass_link(Klass* k);
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
228 // For weak refs clearing in MDO's
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 196
diff changeset
229 static void revisit_mdo(DataLayout* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 };
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 class PreservedMark VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
234 oop _obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 markOop _mark;
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
238 void init(oop obj, markOop mark) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 _obj = obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 _mark = mark;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 void adjust_pointer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 MarkSweep::adjust_pointer(&_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void restore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 _obj->set_mark(_mark);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 };