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

Tue, 21 Aug 2012 14:10:39 -0700

author
johnc
date
Tue, 21 Aug 2012 14:10:39 -0700
changeset 3998
7383557659bd
parent 3900
d2a62e0f25eb
child 4037
da91efe96a93
permissions
-rw-r--r--

7185699: G1: Prediction model discrepancies
Summary: Correct the result value of G1CollectedHeap::pending_card_num(). Change the code that calculates the GC efficiency of a non-young heap region to use historical data from mixed GCs and the actual number of live bytes when predicting how long it would take to collect the region. Changes were also reviewed by Thomas Schatzl.
Reviewed-by: azeemj, brutisso

ysr@777 1 /*
johnc@3466 2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. 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 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1REMSET_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1REMSET_HPP
stefank@2314 27
ysr@777 28 // A G1RemSet provides ways of iterating over pointers into a selected
ysr@777 29 // collection set.
ysr@777 30
ysr@777 31 class G1CollectedHeap;
ysr@777 32 class CardTableModRefBarrierSet;
ysr@777 33 class ConcurrentG1Refine;
ysr@777 34
johnc@2216 35 // A G1RemSet in which each heap region has a rem set that records the
johnc@2216 36 // external heap references into it. Uses a mod ref bs to track updates,
johnc@2216 37 // so that they can be used to update the individual region remsets.
johnc@2216 38
zgu@3900 39 class G1RemSet: public CHeapObj<mtGC> {
ysr@777 40 protected:
ysr@777 41 G1CollectedHeap* _g1;
ysr@777 42 unsigned _conc_refine_cards;
jmasa@3357 43 uint n_workers();
ysr@777 44
ysr@777 45 protected:
ysr@777 46 enum SomePrivateConstants {
ysr@777 47 UpdateRStoMergeSync = 0,
ysr@777 48 MergeRStoDoDirtySync = 1,
ysr@777 49 DoDirtySync = 2,
ysr@777 50 LastSync = 3,
ysr@777 51
ysr@777 52 SeqTask = 0,
ysr@777 53 NumSeqTasks = 1
ysr@777 54 };
ysr@777 55
ysr@777 56 CardTableModRefBS* _ct_bs;
ysr@777 57 SubTasksDone* _seq_task;
ysr@777 58 G1CollectorPolicy* _g1p;
ysr@777 59
ysr@777 60 ConcurrentG1Refine* _cg1r;
ysr@777 61
ysr@777 62 size_t* _cards_scanned;
ysr@777 63 size_t _total_cards_scanned;
ysr@777 64
johnc@2060 65 // Used for caching the closure that is responsible for scanning
johnc@2060 66 // references into the collection set.
johnc@2060 67 OopsInHeapRegionClosure** _cset_rs_update_cl;
ysr@1280 68
johnc@1325 69 // The routine that performs the actual work of refining a dirty
johnc@1325 70 // card.
johnc@2060 71 // If check_for_refs_into_refs is true then a true result is returned
johnc@2060 72 // if the card contains oops that have references into the current
johnc@2060 73 // collection set.
johnc@2060 74 bool concurrentRefineOneCard_impl(jbyte* card_ptr, int worker_i,
johnc@2060 75 bool check_for_refs_into_cset);
johnc@1325 76
ysr@777 77 public:
ysr@777 78 // This is called to reset dual hash tables after the gc pause
ysr@777 79 // is finished and the initial hash table is no longer being
ysr@777 80 // scanned.
ysr@777 81 void cleanupHRRS();
ysr@777 82
johnc@2216 83 G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
johnc@2216 84 ~G1RemSet();
ysr@777 85
johnc@2216 86 // Invoke "blk->do_oop" on all pointers into the CS in objects in regions
johnc@2216 87 // outside the CS (having invoked "blk->set_region" to set the "from"
johnc@2216 88 // region correctly beforehand.) The "worker_i" param is for the
johnc@2216 89 // parallel case where the number of the worker thread calling this
johnc@2216 90 // function can be helpful in partitioning the work to be done. It
johnc@2216 91 // should be the same as the "i" passed to the calling thread's
johnc@2216 92 // work(i) function. In the sequential case this param will be ingored.
ysr@777 93 void oops_into_collection_set_do(OopsInHeapRegionClosure* blk,
ysr@777 94 int worker_i);
ysr@777 95
johnc@2216 96 // Prepare for and cleanup after an oops_into_collection_set_do
johnc@2216 97 // call. Must call each of these once before and after (in sequential
johnc@2216 98 // code) any threads call oops_into_collection_set_do. (This offers an
johnc@2216 99 // opportunity to sequential setup and teardown of structures needed by a
johnc@2216 100 // parallel iteration over the CS's RS.)
ysr@777 101 void prepare_for_oops_into_collection_set_do();
ysr@777 102 void cleanup_after_oops_into_collection_set_do();
johnc@2216 103
ysr@777 104 void scanRS(OopsInHeapRegionClosure* oc, int worker_i);
johnc@2060 105 void updateRS(DirtyCardQueue* into_cset_dcq, int worker_i);
johnc@2216 106
ysr@777 107 CardTableModRefBS* ct_bs() { return _ct_bs; }
ysr@777 108 size_t cardsScanned() { return _total_cards_scanned; }
ysr@777 109
ysr@777 110 // Record, if necessary, the fact that *p (where "p" is in region "from",
ysr@777 111 // which is required to be non-NULL) has changed to a new non-NULL value.
johnc@2302 112 template <class T> void write_ref(HeapRegion* from, T* p);
johnc@2302 113 template <class T> void par_write_ref(HeapRegion* from, T* p, int tid);
ysr@777 114
johnc@2216 115 // Requires "region_bm" and "card_bm" to be bitmaps with 1 bit per region
johnc@2216 116 // or card, respectively, such that a region or card with a corresponding
johnc@2216 117 // 0 bit contains no part of any live object. Eliminates any remembered
johnc@2216 118 // set entries that correspond to dead heap ranges.
ysr@777 119 void scrub(BitMap* region_bm, BitMap* card_bm);
johnc@2216 120
johnc@2216 121 // Like the above, but assumes is called in parallel: "worker_num" is the
johnc@2216 122 // parallel thread id of the current thread, and "claim_val" is the
johnc@2216 123 // value that should be used to claim heap regions.
ysr@777 124 void scrub_par(BitMap* region_bm, BitMap* card_bm,
jmasa@3357 125 uint worker_num, int claim_val);
ysr@777 126
johnc@2216 127 // Refine the card corresponding to "card_ptr". If "sts" is non-NULL,
johnc@2216 128 // join and leave around parts that must be atomic wrt GC. (NULL means
johnc@2216 129 // being done at a safepoint.)
johnc@2216 130 // If check_for_refs_into_cset is true, a true result is returned
johnc@2216 131 // if the given card contains oops that have references into the
johnc@2216 132 // current collection set.
johnc@2060 133 virtual bool concurrentRefineOneCard(jbyte* card_ptr, int worker_i,
johnc@2060 134 bool check_for_refs_into_cset);
ysr@777 135
johnc@2216 136 // Print any relevant summary info.
ysr@777 137 virtual void print_summary_info();
johnc@2216 138
johnc@2216 139 // Prepare remembered set for verification.
ysr@777 140 virtual void prepare_for_verify();
ysr@777 141 };
ysr@777 142
ysr@777 143 class CountNonCleanMemRegionClosure: public MemRegionClosure {
ysr@777 144 G1CollectedHeap* _g1;
ysr@777 145 int _n;
ysr@777 146 HeapWord* _start_first;
ysr@777 147 public:
ysr@777 148 CountNonCleanMemRegionClosure(G1CollectedHeap* g1) :
ysr@777 149 _g1(g1), _n(0), _start_first(NULL)
ysr@777 150 {}
ysr@777 151 void do_MemRegion(MemRegion mr);
ysr@777 152 int n() { return _n; };
ysr@777 153 HeapWord* start_first() { return _start_first; }
ysr@777 154 };
apetrusenko@1061 155
apetrusenko@1061 156 class UpdateRSOopClosure: public OopClosure {
apetrusenko@1061 157 HeapRegion* _from;
johnc@2216 158 G1RemSet* _rs;
apetrusenko@1061 159 int _worker_i;
ysr@1280 160
ysr@1280 161 template <class T> void do_oop_work(T* p);
ysr@1280 162
apetrusenko@1061 163 public:
johnc@2216 164 UpdateRSOopClosure(G1RemSet* rs, int worker_i = 0) :
johnc@2302 165 _from(NULL), _rs(rs), _worker_i(worker_i)
johnc@2302 166 {}
apetrusenko@1061 167
apetrusenko@1061 168 void set_from(HeapRegion* from) {
apetrusenko@1061 169 assert(from != NULL, "from region must be non-NULL");
apetrusenko@1061 170 _from = from;
apetrusenko@1061 171 }
apetrusenko@1061 172
ysr@1280 173 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
ysr@1280 174 virtual void do_oop(oop* p) { do_oop_work(p); }
apetrusenko@1061 175
apetrusenko@1061 176 // Override: this closure is idempotent.
apetrusenko@1061 177 // bool idempotent() { return true; }
apetrusenko@1061 178 bool apply_to_weak_ref_discovered_field() { return true; }
apetrusenko@1061 179 };
johnc@2060 180
johnc@2060 181 class UpdateRSetImmediate: public OopsInHeapRegionClosure {
johnc@2060 182 private:
johnc@2060 183 G1RemSet* _g1_rem_set;
johnc@2060 184
johnc@2060 185 template <class T> void do_oop_work(T* p);
johnc@2060 186 public:
johnc@2060 187 UpdateRSetImmediate(G1RemSet* rs) :
johnc@2060 188 _g1_rem_set(rs) {}
johnc@2060 189
johnc@2060 190 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
johnc@2060 191 virtual void do_oop( oop* p) { do_oop_work(p); }
johnc@2060 192 };
johnc@2302 193
stefank@2314 194
stefank@2314 195 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1REMSET_HPP

mercurial