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

Tue, 30 Sep 2014 09:44:36 +0200

author
tschatzl
date
Tue, 30 Sep 2014 09:44:36 +0200
changeset 7218
6948da6d7c13
parent 7208
7baf47cb97cb
child 7535
7ae4e26cb1e0
child 7655
8e9ede9dd2cd
permissions
-rw-r--r--

8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
Summary: Remove -XX:-G1DeferredRSUpdate functionality as it is racy. During evacuation failure handling, threads where evacuation failure handling occurred may try to add remembered sets to regions which remembered sets are currently being scanned. The iterator to handle the remembered set scan does not support addition of entries during scan and so may skip valid references.
Reviewed-by: iveresov, brutisso, mgerdin

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

mercurial