src/share/vm/gc_implementation/g1/g1OopClosures.hpp

Sat, 07 Nov 2020 10:30:02 +0800

author
aoqi
date
Sat, 07 Nov 2020 10:30:02 +0800
changeset 10026
8c95980d0b66
parent 7994
04ff2f6cd0eb
permissions
-rw-r--r--

Added tag mips-jdk8u275-b01 for changeset d3b4d62f391f

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP
aoqi@0 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP
aoqi@0 27
stefank@6992 28 #include "memory/iterator.hpp"
tschatzl@7651 29 #include "oops/markOop.hpp"
stefank@6992 30
aoqi@0 31 class HeapRegion;
aoqi@0 32 class G1CollectedHeap;
aoqi@0 33 class G1RemSet;
aoqi@0 34 class ConcurrentMark;
aoqi@0 35 class DirtyCardToOopClosure;
aoqi@0 36 class CMBitMap;
aoqi@0 37 class CMMarkStack;
aoqi@0 38 class G1ParScanThreadState;
aoqi@0 39 class CMTask;
aoqi@0 40 class ReferenceProcessor;
aoqi@0 41
aoqi@0 42 // A class that scans oops in a given heap region (much as OopsInGenClosure
aoqi@0 43 // scans oops in a generation.)
aoqi@0 44 class OopsInHeapRegionClosure: public ExtendedOopClosure {
aoqi@0 45 protected:
aoqi@0 46 HeapRegion* _from;
aoqi@0 47 public:
aoqi@0 48 void set_region(HeapRegion* from) { _from = from; }
aoqi@0 49 };
aoqi@0 50
aoqi@0 51 class G1ParClosureSuper : public OopsInHeapRegionClosure {
aoqi@0 52 protected:
aoqi@0 53 G1CollectedHeap* _g1;
aoqi@0 54 G1ParScanThreadState* _par_scan_state;
aoqi@0 55 uint _worker_id;
aoqi@0 56 public:
tschatzl@6939 57 // Initializes the instance, leaving _par_scan_state uninitialized. Must be done
tschatzl@6939 58 // later using the set_par_scan_thread_state() method.
tschatzl@6939 59 G1ParClosureSuper(G1CollectedHeap* g1);
aoqi@0 60 G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state);
aoqi@0 61 bool apply_to_weak_ref_discovered_field() { return true; }
tschatzl@6939 62
tschatzl@6939 63 void set_par_scan_thread_state(G1ParScanThreadState* par_scan_state);
aoqi@0 64 };
aoqi@0 65
aoqi@0 66 class G1ParPushHeapRSClosure : public G1ParClosureSuper {
aoqi@0 67 public:
aoqi@0 68 G1ParPushHeapRSClosure(G1CollectedHeap* g1,
aoqi@0 69 G1ParScanThreadState* par_scan_state):
aoqi@0 70 G1ParClosureSuper(g1, par_scan_state) { }
aoqi@0 71
aoqi@0 72 template <class T> void do_oop_nv(T* p);
aoqi@0 73 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 74 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 75 };
aoqi@0 76
aoqi@0 77 class G1ParScanClosure : public G1ParClosureSuper {
aoqi@0 78 public:
tschatzl@6939 79 G1ParScanClosure(G1CollectedHeap* g1, ReferenceProcessor* rp) :
tschatzl@6939 80 G1ParClosureSuper(g1) {
aoqi@0 81 assert(_ref_processor == NULL, "sanity");
aoqi@0 82 _ref_processor = rp;
aoqi@0 83 }
aoqi@0 84
aoqi@0 85 template <class T> void do_oop_nv(T* p);
aoqi@0 86 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 87 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 88 };
aoqi@0 89
aoqi@0 90 // Add back base class for metadata
aoqi@0 91 class G1ParCopyHelper : public G1ParClosureSuper {
aoqi@0 92 protected:
aoqi@0 93 Klass* _scanned_klass;
aoqi@0 94 ConcurrentMark* _cm;
aoqi@0 95
aoqi@0 96 // Mark the object if it's not already marked. This is used to mark
aoqi@0 97 // objects pointed to by roots that are guaranteed not to move
aoqi@0 98 // during the GC (i.e., non-CSet objects). It is MT-safe.
aoqi@0 99 void mark_object(oop obj);
aoqi@0 100
aoqi@0 101 // Mark the object if it's not already marked. This is used to mark
aoqi@0 102 // objects pointed to by roots that have been forwarded during a
aoqi@0 103 // GC. It is MT-safe.
aoqi@0 104 void mark_forwarded_object(oop from_obj, oop to_obj);
aoqi@0 105 public:
aoqi@0 106 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state);
aoqi@0 107
aoqi@0 108 void set_scanned_klass(Klass* k) { _scanned_klass = k; }
aoqi@0 109 template <class T> void do_klass_barrier(T* p, oop new_obj);
aoqi@0 110 };
aoqi@0 111
stefank@6992 112 template <G1Barrier barrier, G1Mark do_mark_object>
aoqi@0 113 class G1ParCopyClosure : public G1ParCopyHelper {
aoqi@0 114 private:
aoqi@0 115 template <class T> void do_oop_work(T* p);
aoqi@0 116
aoqi@0 117 public:
aoqi@0 118 G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state,
aoqi@0 119 ReferenceProcessor* rp) :
aoqi@0 120 G1ParCopyHelper(g1, par_scan_state) {
aoqi@0 121 assert(_ref_processor == NULL, "sanity");
aoqi@0 122 }
aoqi@0 123
aoqi@0 124 template <class T> void do_oop_nv(T* p) { do_oop_work(p); }
aoqi@0 125 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 126 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
stefank@6992 127
stefank@6992 128 G1CollectedHeap* g1() { return _g1; };
stefank@6992 129 G1ParScanThreadState* pss() { return _par_scan_state; }
stefank@6992 130 ReferenceProcessor* rp() { return _ref_processor; };
aoqi@0 131 };
aoqi@0 132
stefank@6992 133 typedef G1ParCopyClosure<G1BarrierNone, G1MarkNone> G1ParScanExtRootClosure;
stefank@6992 134 typedef G1ParCopyClosure<G1BarrierNone, G1MarkFromRoot> G1ParScanAndMarkExtRootClosure;
stefank@6992 135 typedef G1ParCopyClosure<G1BarrierNone, G1MarkPromotedFromRoot> G1ParScanAndMarkWeakExtRootClosure;
aoqi@0 136 // We use a separate closure to handle references during evacuation
aoqi@0 137 // failure processing.
aoqi@0 138
stefank@6992 139 typedef G1ParCopyClosure<G1BarrierEvac, G1MarkNone> G1ParScanHeapEvacFailureClosure;
aoqi@0 140
aoqi@0 141 class FilterIntoCSClosure: public ExtendedOopClosure {
aoqi@0 142 G1CollectedHeap* _g1;
aoqi@0 143 OopClosure* _oc;
aoqi@0 144 DirtyCardToOopClosure* _dcto_cl;
aoqi@0 145 public:
aoqi@0 146 FilterIntoCSClosure( DirtyCardToOopClosure* dcto_cl,
aoqi@0 147 G1CollectedHeap* g1,
aoqi@0 148 OopClosure* oc) :
aoqi@0 149 _dcto_cl(dcto_cl), _g1(g1), _oc(oc) { }
aoqi@0 150
aoqi@0 151 template <class T> void do_oop_nv(T* p);
aoqi@0 152 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 153 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 154 bool apply_to_weak_ref_discovered_field() { return true; }
aoqi@0 155 };
aoqi@0 156
aoqi@0 157 class FilterOutOfRegionClosure: public ExtendedOopClosure {
aoqi@0 158 HeapWord* _r_bottom;
aoqi@0 159 HeapWord* _r_end;
aoqi@0 160 OopClosure* _oc;
aoqi@0 161 public:
aoqi@0 162 FilterOutOfRegionClosure(HeapRegion* r, OopClosure* oc);
aoqi@0 163 template <class T> void do_oop_nv(T* p);
aoqi@0 164 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 165 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 166 bool apply_to_weak_ref_discovered_field() { return true; }
aoqi@0 167 };
aoqi@0 168
aoqi@0 169 // Closure for iterating over object fields during concurrent marking
stefank@6992 170 class G1CMOopClosure : public MetadataAwareOopClosure {
stefank@6992 171 protected:
stefank@6992 172 ConcurrentMark* _cm;
aoqi@0 173 private:
aoqi@0 174 G1CollectedHeap* _g1h;
aoqi@0 175 CMTask* _task;
aoqi@0 176 public:
aoqi@0 177 G1CMOopClosure(G1CollectedHeap* g1h, ConcurrentMark* cm, CMTask* task);
aoqi@0 178 template <class T> void do_oop_nv(T* p);
aoqi@0 179 virtual void do_oop( oop* p) { do_oop_nv(p); }
aoqi@0 180 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 181 };
aoqi@0 182
aoqi@0 183 // Closure to scan the root regions during concurrent marking
stefank@6992 184 class G1RootRegionScanClosure : public MetadataAwareOopClosure {
aoqi@0 185 private:
aoqi@0 186 G1CollectedHeap* _g1h;
aoqi@0 187 ConcurrentMark* _cm;
aoqi@0 188 uint _worker_id;
aoqi@0 189 public:
aoqi@0 190 G1RootRegionScanClosure(G1CollectedHeap* g1h, ConcurrentMark* cm,
aoqi@0 191 uint worker_id) :
aoqi@0 192 _g1h(g1h), _cm(cm), _worker_id(worker_id) { }
aoqi@0 193 template <class T> void do_oop_nv(T* p);
aoqi@0 194 virtual void do_oop( oop* p) { do_oop_nv(p); }
aoqi@0 195 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 196 };
aoqi@0 197
aoqi@0 198 // Closure that applies the given two closures in sequence.
aoqi@0 199 // Used by the RSet refinement code (when updating RSets
aoqi@0 200 // during an evacuation pause) to record cards containing
aoqi@0 201 // pointers into the collection set.
aoqi@0 202
aoqi@0 203 class G1Mux2Closure : public ExtendedOopClosure {
aoqi@0 204 OopClosure* _c1;
aoqi@0 205 OopClosure* _c2;
aoqi@0 206 public:
aoqi@0 207 G1Mux2Closure(OopClosure *c1, OopClosure *c2);
aoqi@0 208 template <class T> void do_oop_nv(T* p);
aoqi@0 209 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 210 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 211 };
aoqi@0 212
aoqi@0 213 // A closure that returns true if it is actually applied
aoqi@0 214 // to a reference
aoqi@0 215
aoqi@0 216 class G1TriggerClosure : public ExtendedOopClosure {
aoqi@0 217 bool _triggered;
aoqi@0 218 public:
aoqi@0 219 G1TriggerClosure();
aoqi@0 220 bool triggered() const { return _triggered; }
aoqi@0 221 template <class T> void do_oop_nv(T* p);
aoqi@0 222 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 223 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 224 };
aoqi@0 225
aoqi@0 226 // A closure which uses a triggering closure to determine
aoqi@0 227 // whether to apply an oop closure.
aoqi@0 228
aoqi@0 229 class G1InvokeIfNotTriggeredClosure: public ExtendedOopClosure {
aoqi@0 230 G1TriggerClosure* _trigger_cl;
aoqi@0 231 OopClosure* _oop_cl;
aoqi@0 232 public:
aoqi@0 233 G1InvokeIfNotTriggeredClosure(G1TriggerClosure* t, OopClosure* oc);
aoqi@0 234 template <class T> void do_oop_nv(T* p);
aoqi@0 235 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 236 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 237 };
aoqi@0 238
aoqi@0 239 class G1UpdateRSOrPushRefOopClosure: public ExtendedOopClosure {
aoqi@0 240 G1CollectedHeap* _g1;
aoqi@0 241 G1RemSet* _g1_rem_set;
aoqi@0 242 HeapRegion* _from;
mgerdin@7971 243 G1ParPushHeapRSClosure* _push_ref_cl;
aoqi@0 244 bool _record_refs_into_cset;
aoqi@0 245 uint _worker_i;
aoqi@0 246
aoqi@0 247 public:
aoqi@0 248 G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h,
aoqi@0 249 G1RemSet* rs,
mgerdin@7971 250 G1ParPushHeapRSClosure* push_ref_cl,
aoqi@0 251 bool record_refs_into_cset,
aoqi@0 252 uint worker_i = 0);
aoqi@0 253
aoqi@0 254 void set_from(HeapRegion* from) {
aoqi@0 255 assert(from != NULL, "from region must be non-NULL");
aoqi@0 256 _from = from;
aoqi@0 257 }
aoqi@0 258
aoqi@0 259 bool self_forwarded(oop obj) {
tschatzl@7651 260 markOop m = obj->mark();
tschatzl@7651 261 bool result = (m->is_marked() && ((oop)m->decode_pointer() == obj));
aoqi@0 262 return result;
aoqi@0 263 }
aoqi@0 264
aoqi@0 265 bool apply_to_weak_ref_discovered_field() { return true; }
aoqi@0 266
aoqi@0 267 template <class T> void do_oop_nv(T* p);
aoqi@0 268 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
aoqi@0 269 virtual void do_oop(oop* p) { do_oop_nv(p); }
aoqi@0 270 };
aoqi@0 271
aoqi@0 272 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP

mercurial