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

Fri, 12 Jun 2009 16:20:16 -0400

author
tonyp
date
Fri, 12 Jun 2009 16:20:16 -0400
changeset 1246
830ca2573896
parent 1229
315a5d70b295
child 1280
df6caf649ff7
permissions
-rw-r--r--

6850846: G1: extend G1 marking verification
Summary: extend G1 marking verification to use either the "prev" or "next" marking information, as appropriate.
Reviewed-by: johnc, ysr

ysr@777 1 /*
xdono@1014 2 * Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
ysr@777 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
ysr@777 20 * CA 95054 USA or visit www.sun.com if you need additional information or
ysr@777 21 * have any questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
ysr@777 25 // A G1RemSet provides ways of iterating over pointers into a selected
ysr@777 26 // collection set.
ysr@777 27
ysr@777 28 class G1CollectedHeap;
ysr@777 29 class CardTableModRefBarrierSet;
ysr@777 30 class HRInto_G1RemSet;
ysr@777 31 class ConcurrentG1Refine;
ysr@777 32
apetrusenko@984 33 class G1RemSet: public CHeapObj {
ysr@777 34 protected:
ysr@777 35 G1CollectedHeap* _g1;
ysr@777 36 unsigned _conc_refine_cards;
ysr@777 37 size_t n_workers();
ysr@777 38
ysr@777 39 public:
ysr@777 40 G1RemSet(G1CollectedHeap* g1) :
iveresov@1229 41 _g1(g1), _conc_refine_cards(0)
ysr@777 42 {}
ysr@777 43
ysr@777 44 // Invoke "blk->do_oop" on all pointers into the CS in object in regions
ysr@777 45 // outside the CS (having invoked "blk->set_region" to set the "from"
ysr@777 46 // region correctly beforehand.) The "worker_i" param is for the
ysr@777 47 // parallel case where the number of the worker thread calling this
ysr@777 48 // function can be helpful in partitioning the work to be done. It
ysr@777 49 // should be the same as the "i" passed to the calling thread's
ysr@777 50 // work(i) function. In the sequential case this param will be ingored.
ysr@777 51 virtual void oops_into_collection_set_do(OopsInHeapRegionClosure* blk,
ysr@777 52 int worker_i) = 0;
ysr@777 53
ysr@777 54 // Prepare for and cleanup after an oops_into_collection_set_do
ysr@777 55 // call. Must call each of these once before and after (in sequential
ysr@777 56 // code) any threads call oops into collection set do. (This offers an
ysr@777 57 // opportunity to sequential setup and teardown of structures needed by a
ysr@777 58 // parallel iteration over the CS's RS.)
ysr@777 59 virtual void prepare_for_oops_into_collection_set_do() = 0;
ysr@777 60 virtual void cleanup_after_oops_into_collection_set_do() = 0;
ysr@777 61
ysr@777 62 // If "this" is of the given subtype, return "this", else "NULL".
ysr@777 63 virtual HRInto_G1RemSet* as_HRInto_G1RemSet() { return NULL; }
ysr@777 64
ysr@777 65 // Record, if necessary, the fact that *p (where "p" is in region "from")
ysr@777 66 // has changed to its new value.
ysr@777 67 virtual void write_ref(HeapRegion* from, oop* p) = 0;
ysr@777 68 virtual void par_write_ref(HeapRegion* from, oop* p, int tid) = 0;
ysr@777 69
ysr@777 70 // Requires "region_bm" and "card_bm" to be bitmaps with 1 bit per region
ysr@777 71 // or card, respectively, such that a region or card with a corresponding
ysr@777 72 // 0 bit contains no part of any live object. Eliminates any remembered
ysr@777 73 // set entries that correspond to dead heap ranges.
ysr@777 74 virtual void scrub(BitMap* region_bm, BitMap* card_bm) = 0;
ysr@777 75 // Like the above, but assumes is called in parallel: "worker_num" is the
ysr@777 76 // parallel thread id of the current thread, and "claim_val" is the
ysr@777 77 // value that should be used to claim heap regions.
ysr@777 78 virtual void scrub_par(BitMap* region_bm, BitMap* card_bm,
ysr@777 79 int worker_num, int claim_val) = 0;
ysr@777 80
ysr@777 81 // Refine the card corresponding to "card_ptr". If "sts" is non-NULL,
ysr@777 82 // join and leave around parts that must be atomic wrt GC. (NULL means
ysr@777 83 // being done at a safepoint.)
ysr@777 84 virtual void concurrentRefineOneCard(jbyte* card_ptr, int worker_i) {}
ysr@777 85
ysr@777 86 // Print any relevant summary info.
ysr@777 87 virtual void print_summary_info() {}
ysr@777 88
ysr@777 89 // Prepare remebered set for verification.
ysr@777 90 virtual void prepare_for_verify() {};
ysr@777 91 };
ysr@777 92
ysr@777 93
ysr@777 94 // The simplest possible G1RemSet: iterates over all objects in non-CS
ysr@777 95 // regions, searching for pointers into the CS.
ysr@777 96 class StupidG1RemSet: public G1RemSet {
ysr@777 97 public:
ysr@777 98 StupidG1RemSet(G1CollectedHeap* g1) : G1RemSet(g1) {}
ysr@777 99
ysr@777 100 void oops_into_collection_set_do(OopsInHeapRegionClosure* blk,
ysr@777 101 int worker_i);
ysr@777 102
ysr@777 103 void prepare_for_oops_into_collection_set_do() {}
ysr@777 104 void cleanup_after_oops_into_collection_set_do() {}
ysr@777 105
ysr@777 106 // Nothing is necessary in the version below.
ysr@777 107 void write_ref(HeapRegion* from, oop* p) {}
ysr@777 108 void par_write_ref(HeapRegion* from, oop* p, int tid) {}
ysr@777 109
ysr@777 110 void scrub(BitMap* region_bm, BitMap* card_bm) {}
ysr@777 111 void scrub_par(BitMap* region_bm, BitMap* card_bm,
ysr@777 112 int worker_num, int claim_val) {}
ysr@777 113
ysr@777 114 };
ysr@777 115
ysr@777 116 // A G1RemSet in which each heap region has a rem set that records the
ysr@777 117 // external heap references into it. Uses a mod ref bs to track updates,
ysr@777 118 // so that they can be used to update the individual region remsets.
ysr@777 119
ysr@777 120 class HRInto_G1RemSet: public G1RemSet {
ysr@777 121 protected:
ysr@777 122 enum SomePrivateConstants {
ysr@777 123 UpdateRStoMergeSync = 0,
ysr@777 124 MergeRStoDoDirtySync = 1,
ysr@777 125 DoDirtySync = 2,
ysr@777 126 LastSync = 3,
ysr@777 127
ysr@777 128 SeqTask = 0,
ysr@777 129 NumSeqTasks = 1
ysr@777 130 };
ysr@777 131
ysr@777 132 CardTableModRefBS* _ct_bs;
ysr@777 133 SubTasksDone* _seq_task;
ysr@777 134 G1CollectorPolicy* _g1p;
ysr@777 135
ysr@777 136 ConcurrentG1Refine* _cg1r;
ysr@777 137
ysr@777 138 size_t* _cards_scanned;
ysr@777 139 size_t _total_cards_scanned;
ysr@777 140
ysr@777 141 // _par_traversal_in_progress is "true" iff a parallel traversal is in
ysr@777 142 // progress. If so, then cards added to remembered sets should also have
ysr@777 143 // their references into the collection summarized in "_new_refs".
ysr@777 144 bool _par_traversal_in_progress;
iveresov@1229 145 void set_par_traversal(bool b) { _par_traversal_in_progress = b; }
ysr@777 146 GrowableArray<oop*>** _new_refs;
iveresov@1051 147 void new_refs_iterate(OopClosure* cl);
ysr@777 148
ysr@777 149 public:
ysr@777 150 // This is called to reset dual hash tables after the gc pause
ysr@777 151 // is finished and the initial hash table is no longer being
ysr@777 152 // scanned.
ysr@777 153 void cleanupHRRS();
ysr@777 154
ysr@777 155 HRInto_G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
ysr@777 156 ~HRInto_G1RemSet();
ysr@777 157
ysr@777 158 void oops_into_collection_set_do(OopsInHeapRegionClosure* blk,
ysr@777 159 int worker_i);
ysr@777 160
ysr@777 161 void prepare_for_oops_into_collection_set_do();
ysr@777 162 void cleanup_after_oops_into_collection_set_do();
ysr@777 163 void scanRS(OopsInHeapRegionClosure* oc, int worker_i);
ysr@777 164 void scanNewRefsRS(OopsInHeapRegionClosure* oc, int worker_i);
ysr@777 165 void updateRS(int worker_i);
ysr@777 166 HeapRegion* calculateStartRegion(int i);
ysr@777 167
ysr@777 168 HRInto_G1RemSet* as_HRInto_G1RemSet() { return this; }
ysr@777 169
ysr@777 170 CardTableModRefBS* ct_bs() { return _ct_bs; }
ysr@777 171 size_t cardsScanned() { return _total_cards_scanned; }
ysr@777 172
ysr@777 173 // Record, if necessary, the fact that *p (where "p" is in region "from",
ysr@777 174 // which is required to be non-NULL) has changed to a new non-NULL value.
ysr@777 175 inline void write_ref(HeapRegion* from, oop* p);
ysr@777 176 // The "_nv" version is the same; it exists just so that it is not virtual.
ysr@777 177 inline void write_ref_nv(HeapRegion* from, oop* p);
ysr@777 178
ysr@777 179 inline bool self_forwarded(oop obj);
ysr@777 180 inline void par_write_ref(HeapRegion* from, oop* p, int tid);
ysr@777 181
ysr@777 182 void scrub(BitMap* region_bm, BitMap* card_bm);
ysr@777 183 void scrub_par(BitMap* region_bm, BitMap* card_bm,
ysr@777 184 int worker_num, int claim_val);
ysr@777 185
ysr@777 186 virtual void concurrentRefineOneCard(jbyte* card_ptr, int worker_i);
ysr@777 187
ysr@777 188 virtual void print_summary_info();
ysr@777 189 virtual void prepare_for_verify();
ysr@777 190 };
ysr@777 191
ysr@777 192 #define G1_REM_SET_LOGGING 0
ysr@777 193
ysr@777 194 class CountNonCleanMemRegionClosure: public MemRegionClosure {
ysr@777 195 G1CollectedHeap* _g1;
ysr@777 196 int _n;
ysr@777 197 HeapWord* _start_first;
ysr@777 198 public:
ysr@777 199 CountNonCleanMemRegionClosure(G1CollectedHeap* g1) :
ysr@777 200 _g1(g1), _n(0), _start_first(NULL)
ysr@777 201 {}
ysr@777 202 void do_MemRegion(MemRegion mr);
ysr@777 203 int n() { return _n; };
ysr@777 204 HeapWord* start_first() { return _start_first; }
ysr@777 205 };
apetrusenko@1061 206
apetrusenko@1061 207 class UpdateRSOopClosure: public OopClosure {
apetrusenko@1061 208 HeapRegion* _from;
apetrusenko@1061 209 HRInto_G1RemSet* _rs;
apetrusenko@1061 210 int _worker_i;
apetrusenko@1061 211 public:
apetrusenko@1061 212 UpdateRSOopClosure(HRInto_G1RemSet* rs, int worker_i = 0) :
apetrusenko@1061 213 _from(NULL), _rs(rs), _worker_i(worker_i) {
apetrusenko@1061 214 guarantee(_rs != NULL, "Requires an HRIntoG1RemSet");
apetrusenko@1061 215 }
apetrusenko@1061 216
apetrusenko@1061 217 void set_from(HeapRegion* from) {
apetrusenko@1061 218 assert(from != NULL, "from region must be non-NULL");
apetrusenko@1061 219 _from = from;
apetrusenko@1061 220 }
apetrusenko@1061 221
apetrusenko@1061 222 virtual void do_oop(narrowOop* p);
apetrusenko@1061 223 virtual void do_oop(oop* p);
apetrusenko@1061 224
apetrusenko@1061 225 // Override: this closure is idempotent.
apetrusenko@1061 226 // bool idempotent() { return true; }
apetrusenko@1061 227 bool apply_to_weak_ref_discovered_field() { return true; }
apetrusenko@1061 228 };
apetrusenko@1061 229

mercurial