1 /*
2 * Copyright (c) 1997, 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 *
33 #include "oops/oop.hpp"
34 #include "runtime/timer.hpp"
35 #include "utilities/growableArray.hpp"
36 #include "utilities/stack.hpp"
37
38 class ReferenceProcessor;
39 class DataLayout;
40 class SerialOldTracer;
41 class STWGCTimer;
42
43 // MarkSweep takes care of global mark-compact garbage collection for a
44 // GenCollectedHeap using a four-phase pointer forwarding algorithm. All
45 // generations are assumed to support marking; those that can also support
46 // compaction.
47 //
48 // Class unloading will only occur when a full gc is invoked.
49
50 // declared at end
51 class PreservedMark;
52 class MarkAndPushClosure;
53
54 class MarkSweep : AllStatic {
55 //
56 // Inline closure decls
57 //
58 class FollowRootClosure: public OopsInGenClosure {
59 public:
60 virtual void do_oop(oop* p);
61 virtual void do_oop(narrowOop* p);
62 };
63
64 class FollowStackClosure: public VoidClosure {
65 public:
66 virtual void do_void();
67 };
68
69 class AdjustPointerClosure: public OopsInGenClosure {
70 public:
71 template <typename T> void do_oop_nv(T* p);
72 virtual void do_oop(oop* p);
73 virtual void do_oop(narrowOop* p);
74
75 // This closure provides its own oop verification code.
76 debug_only(virtual bool should_verify_oops() { return false; })
77 };
78
79 // Used for java/lang/ref handling
80 class IsAliveClosure: public BoolObjectClosure {
81 public:
82 virtual bool do_object_b(oop p);
83 };
84
85 class KeepAliveClosure: public OopClosure {
86 protected:
87 template <class T> void do_oop_work(T* p);
88 public:
89 virtual void do_oop(oop* p);
90 virtual void do_oop(narrowOop* p);
91 };
92
93 //
94 // Friend decls
95 //
96 friend class AdjustPointerClosure;
97 friend class KeepAliveClosure;
98 friend class VM_MarkSweep;
182 };
183
184 class MarkAndPushClosure: public ExtendedOopClosure {
185 public:
186 template <typename T> void do_oop_nv(T* p);
187 virtual void do_oop(oop* p);
188 virtual void do_oop(narrowOop* p);
189
190 virtual bool do_metadata();
191 bool do_metadata_nv();
192
193 virtual void do_klass(Klass* k);
194 void do_klass_nv(Klass* k);
195
196 virtual void do_cld(ClassLoaderData* cld);
197 void do_cld_nv(ClassLoaderData* cld);
198
199 void set_ref_processor(ReferenceProcessor* rp) {
200 set_ref_processor_internal(rp);
201 }
202 };
203
204 class PreservedMark VALUE_OBJ_CLASS_SPEC {
205 private:
206 oop _obj;
207 markOop _mark;
208
209 public:
210 void init(oop obj, markOop mark) {
211 _obj = obj;
212 _mark = mark;
213 }
214
215 void adjust_pointer();
216 void restore();
217 };
218
219 #endif // SHARE_VM_GC_SERIAL_MARKSWEEP_HPP
|
1 /*
2 * Copyright (c) 1997, 2017, 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 *
33 #include "oops/oop.hpp"
34 #include "runtime/timer.hpp"
35 #include "utilities/growableArray.hpp"
36 #include "utilities/stack.hpp"
37
38 class ReferenceProcessor;
39 class DataLayout;
40 class SerialOldTracer;
41 class STWGCTimer;
42
43 // MarkSweep takes care of global mark-compact garbage collection for a
44 // GenCollectedHeap using a four-phase pointer forwarding algorithm. All
45 // generations are assumed to support marking; those that can also support
46 // compaction.
47 //
48 // Class unloading will only occur when a full gc is invoked.
49
50 // declared at end
51 class PreservedMark;
52 class MarkAndPushClosure;
53 class AdjustPointerClosure;
54
55 class MarkSweep : AllStatic {
56 //
57 // Inline closure decls
58 //
59 class FollowRootClosure: public OopsInGenClosure {
60 public:
61 virtual void do_oop(oop* p);
62 virtual void do_oop(narrowOop* p);
63 };
64
65 class FollowStackClosure: public VoidClosure {
66 public:
67 virtual void do_void();
68 };
69
70 // Used for java/lang/ref handling
71 class IsAliveClosure: public BoolObjectClosure {
72 public:
73 virtual bool do_object_b(oop p);
74 };
75
76 class KeepAliveClosure: public OopClosure {
77 protected:
78 template <class T> void do_oop_work(T* p);
79 public:
80 virtual void do_oop(oop* p);
81 virtual void do_oop(narrowOop* p);
82 };
83
84 //
85 // Friend decls
86 //
87 friend class AdjustPointerClosure;
88 friend class KeepAliveClosure;
89 friend class VM_MarkSweep;
173 };
174
175 class MarkAndPushClosure: public ExtendedOopClosure {
176 public:
177 template <typename T> void do_oop_nv(T* p);
178 virtual void do_oop(oop* p);
179 virtual void do_oop(narrowOop* p);
180
181 virtual bool do_metadata();
182 bool do_metadata_nv();
183
184 virtual void do_klass(Klass* k);
185 void do_klass_nv(Klass* k);
186
187 virtual void do_cld(ClassLoaderData* cld);
188 void do_cld_nv(ClassLoaderData* cld);
189
190 void set_ref_processor(ReferenceProcessor* rp) {
191 set_ref_processor_internal(rp);
192 }
193 };
194
195 class AdjustPointerClosure: public OopsInGenClosure {
196 public:
197 template <typename T> void do_oop_nv(T* p);
198 virtual void do_oop(oop* p);
199 virtual void do_oop(narrowOop* p);
200 virtual ReferenceIterationMode reference_iteration_mode() { return DO_FIELDS; }
201
202 // This closure provides its own oop verification code.
203 debug_only(virtual bool should_verify_oops() { return false; })
204 };
205
206 class PreservedMark VALUE_OBJ_CLASS_SPEC {
207 private:
208 oop _obj;
209 markOop _mark;
210
211 public:
212 void init(oop obj, markOop mark) {
213 _obj = obj;
214 _mark = mark;
215 }
216
217 void adjust_pointer();
218 void restore();
219 };
220
221 #endif // SHARE_VM_GC_SERIAL_MARKSWEEP_HPP
|