annotate hotspot/src/share/vm/gc/g1/g1RemSet.hpp @ 46778:f504c6f2eea5

8183121: Add information about scanned and skipped cards during UpdateRS Summary: Log the number of scanned and skipped cards for the UpdateRS phase too. Reviewed-by: mgerdin, sangheki
author tschatzl
date Wed, 09 Aug 2017 17:27:42 +0200
parents 55a3c36b64b2
children
rev   line source
ysr@1374 1 /*
jprovino@46291 2 * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
ysr@1374 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@1374 4 *
ysr@1374 5 * This code is free software; you can redistribute it and/or modify it
ysr@1374 6 * under the terms of the GNU General Public License version 2 only, as
ysr@1374 7 * published by the Free Software Foundation.
ysr@1374 8 *
ysr@1374 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@1374 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@1374 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@1374 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@1374 13 * accompanied this code).
ysr@1374 14 *
ysr@1374 15 * You should have received a copy of the GNU General Public License version
ysr@1374 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@1374 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@1374 18 *
trims@5547 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@5547 20 * or visit www.oracle.com if you need additional information or have any
trims@5547 21 * questions.
ysr@1374 22 *
ysr@1374 23 */
ysr@1374 24
pliden@30764 25 #ifndef SHARE_VM_GC_G1_G1REMSET_HPP
pliden@30764 26 #define SHARE_VM_GC_G1_G1REMSET_HPP
stefank@7397 27
tschatzl@35198 28 #include "gc/g1/dirtyCardQueue.hpp"
tschatzl@37414 29 #include "gc/g1/g1CardLiveData.hpp"
pliden@30764 30 #include "gc/g1/g1RemSetSummary.hpp"
tschatzl@35198 31 #include "gc/g1/heapRegion.hpp"
tschatzl@35198 32 #include "memory/allocation.hpp"
tschatzl@35198 33 #include "memory/iterator.hpp"
tschatzl@17854 34
ysr@1374 35 // A G1RemSet provides ways of iterating over pointers into a selected
ysr@1374 36 // collection set.
ysr@1374 37
tschatzl@35198 38 class BitMap;
tschatzl@35198 39 class CardTableModRefBS;
david@35461 40 class G1BlockOffsetTable;
tschatzl@35198 41 class CodeBlobClosure;
ysr@1374 42 class G1CollectedHeap;
kbarrett@38172 43 class G1HotCardCache;
tschatzl@37988 44 class G1RemSetScanState;
tschatzl@46572 45 class G1ParScanThreadState;
mgerdin@37985 46 class G1Policy;
tschatzl@35198 47 class G1SATBCardTableModRefBS;
tschatzl@46572 48 class G1ScanObjsDuringScanRSClosure;
tschatzl@46572 49 class G1ScanObjsDuringUpdateRSClosure;
tschatzl@35198 50 class HeapRegionClaimer;
ysr@1374 51
johnc@6958 52 // A G1RemSet in which each heap region has a rem set that records the
johnc@6958 53 // external heap references into it. Uses a mod ref bs to track updates,
johnc@6958 54 // so that they can be used to update the individual region remsets.
zgu@13195 55 class G1RemSet: public CHeapObj<mtGC> {
tschatzl@17854 56 private:
tschatzl@37988 57 G1RemSetScanState* _scan_state;
tschatzl@37414 58 G1CardLiveData _card_live_data;
tschatzl@37414 59
tschatzl@17854 60 G1RemSetSummary _prev_period_summary;
david@33789 61
tschatzl@46575 62 // Scan all remembered sets of the collection set for references into the collection
tschatzl@46575 63 // set.
tschatzl@46575 64 void scan_rem_set(G1ParScanThreadState* pss,
tschatzl@46575 65 CodeBlobClosure* heap_region_codeblobs,
tschatzl@46575 66 uint worker_i);
tschatzl@46575 67
tschatzl@46575 68 // Flush remaining refinement buffers for cross-region references to either evacuate references
tschatzl@46575 69 // into the collection set or update the remembered set.
ehelin@46670 70 void update_rem_set(G1ParScanThreadState* pss, uint worker_i);
tschatzl@46575 71
ysr@1374 72 G1CollectedHeap* _g1;
tschatzl@46614 73 size_t _num_conc_refined_cards; // Number of cards refined concurrently to the mutator.
ysr@1374 74
johnc@17108 75 CardTableModRefBS* _ct_bs;
mgerdin@37985 76 G1Policy* _g1p;
kbarrett@38172 77 G1HotCardCache* _hot_card_cache;
ysr@1374 78
ysr@1374 79 public:
tschatzl@35210 80 // Gives an approximation on how many threads can be expected to add records to
tschatzl@35210 81 // a remembered set in parallel. This can be used for sizing data structures to
tschatzl@35210 82 // decrease performance losses due to data structure sharing.
tschatzl@35210 83 // Examples for quantities that influence this value are the maximum number of
tschatzl@35210 84 // mutator threads, maximum number of concurrent refinement or GC threads.
tschatzl@35210 85 static uint num_par_rem_sets();
tschatzl@35210 86
tschatzl@35210 87 // Initialize data that depends on the heap size being known.
tschatzl@37414 88 void initialize(size_t capacity, uint max_regions);
tschatzl@35210 89
ysr@1374 90 // This is called to reset dual hash tables after the gc pause
ysr@1374 91 // is finished and the initial hash table is no longer being
ysr@1374 92 // scanned.
ysr@1374 93 void cleanupHRRS();
ysr@1374 94
kbarrett@38172 95 G1RemSet(G1CollectedHeap* g1,
kbarrett@38172 96 CardTableModRefBS* ct_bs,
kbarrett@38172 97 G1HotCardCache* hot_card_cache);
johnc@6958 98 ~G1RemSet();
ysr@1374 99
tschatzl@46572 100 // Process all oops in the collection set from the cards in the refinement buffers and
tschatzl@46572 101 // remembered sets using pss.
johnc@19339 102 //
tschatzl@46572 103 // Further applies heap_region_codeblobs on the oops of the unmarked nmethods on the strong code
tschatzl@46572 104 // roots list for each region in the collection set.
tschatzl@46572 105 void oops_into_collection_set_do(G1ParScanThreadState* pss,
tschatzl@46571 106 CodeBlobClosure* heap_region_codeblobs,
tschatzl@46571 107 uint worker_i);
ysr@1374 108
johnc@6958 109 // Prepare for and cleanup after an oops_into_collection_set_do
johnc@6958 110 // call. Must call each of these once before and after (in sequential
tschatzl@46575 111 // code) any thread calls oops_into_collection_set_do.
ysr@1374 112 void prepare_for_oops_into_collection_set_do();
ysr@1374 113 void cleanup_after_oops_into_collection_set_do();
johnc@6958 114
tschatzl@37988 115 G1RemSetScanState* scan_state() const { return _scan_state; }
johnc@6958 116
ysr@1374 117 // Record, if necessary, the fact that *p (where "p" is in region "from",
ysr@1374 118 // which is required to be non-NULL) has changed to a new non-NULL value.
brutisso@26850 119 template <class T> void par_write_ref(HeapRegion* from, T* p, uint tid);
ysr@1374 120
tschatzl@46575 121 // Eliminates any remembered set entries that correspond to dead heap ranges.
tschatzl@37414 122 void scrub(uint worker_num, HeapRegionClaimer* hrclaimer);
ysr@1374 123
tschatzl@46575 124 // Refine the card corresponding to "card_ptr". Safe to be called concurrently
tschatzl@46575 125 // to the mutator.
tschatzl@46519 126 void refine_card_concurrently(jbyte* card_ptr,
tschatzl@46519 127 uint worker_i);
tschatzl@46519 128
tschatzl@46575 129 // Refine the card corresponding to "card_ptr", applying the given closure to
ehelin@46670 130 // all references found. Must only be called during gc.
tschatzl@46778 131 // Returns whether the card has been scanned.
tschatzl@46778 132 bool refine_card_during_gc(jbyte* card_ptr, G1ScanObjsDuringUpdateRSClosure* update_rs_cl);
ysr@1374 133
tschatzl@17854 134 // Print accumulated summary info from the start of the VM.
jprovino@46291 135 void print_summary_info();
johnc@6958 136
tschatzl@17854 137 // Print accumulated summary info from the last time called.
jprovino@46291 138 void print_periodic_summary_info(const char* header, uint period_count);
tschatzl@17854 139
tschatzl@46614 140 size_t num_conc_refined_cards() const { return _num_conc_refined_cards; }
tschatzl@37414 141
tschatzl@37414 142 void create_card_live_data(WorkGang* workers, G1CMBitMap* mark_bitmap);
tschatzl@37414 143 void finalize_card_live_data(WorkGang* workers, G1CMBitMap* mark_bitmap);
tschatzl@37414 144
tschatzl@37414 145 // Verify that the liveness count data created concurrently matches one created
tschatzl@37414 146 // during this safepoint.
tschatzl@37414 147 void verify_card_live_data(WorkGang* workers, G1CMBitMap* actual_bitmap);
tschatzl@37414 148
tschatzl@37414 149 void clear_card_live_data(WorkGang* workers);
tschatzl@37414 150
tschatzl@37414 151 #ifdef ASSERT
tschatzl@37414 152 void verify_card_live_data_is_clear();
tschatzl@37414 153 #endif
ysr@1374 154 };
ysr@1374 155
tschatzl@46575 156 class G1ScanRSForRegionClosure : public HeapRegionClosure {
tschatzl@37988 157 G1RemSetScanState* _scan_state;
tschatzl@37988 158
tschatzl@46571 159 size_t _cards_scanned;
tschatzl@46571 160 size_t _cards_claimed;
tschatzl@46571 161 size_t _cards_skipped;
tschatzl@46571 162
ehelin@34246 163 G1CollectedHeap* _g1h;
ehelin@34246 164
tschatzl@46572 165 G1ScanObjsDuringScanRSClosure* _scan_objs_on_card_cl;
ehelin@34246 166 CodeBlobClosure* _code_root_cl;
ehelin@34246 167
david@35461 168 G1BlockOffsetTable* _bot;
ehelin@34246 169 G1SATBCardTableModRefBS *_ct_bs;
ehelin@34246 170
ehelin@34246 171 double _strong_code_root_scan_time_sec;
ehelin@34246 172 uint _worker_i;
ehelin@34246 173
tschatzl@46635 174 void claim_card(size_t card_index, const uint region_idx_for_card);
tschatzl@46635 175 void scan_card(MemRegion mr, uint region_idx_for_card);
tschatzl@37988 176 void scan_strong_code_roots(HeapRegion* r);
ehelin@34246 177 public:
tschatzl@46575 178 G1ScanRSForRegionClosure(G1RemSetScanState* scan_state,
tschatzl@46575 179 G1ScanObjsDuringScanRSClosure* scan_obj_on_card,
tschatzl@46575 180 CodeBlobClosure* code_root_cl,
tschatzl@46575 181 uint worker_i);
ehelin@34246 182
ehelin@34246 183 bool doHeapRegion(HeapRegion* r);
ehelin@34246 184
ehelin@34246 185 double strong_code_root_scan_time_sec() {
ehelin@34246 186 return _strong_code_root_scan_time_sec;
ehelin@34246 187 }
tschatzl@37988 188
tschatzl@46571 189 size_t cards_scanned() const { return _cards_scanned; }
tschatzl@46571 190 size_t cards_claimed() const { return _cards_claimed; }
tschatzl@46571 191 size_t cards_skipped() const { return _cards_skipped; }
ehelin@34246 192 };
ehelin@34246 193
tschatzl@46575 194 class RebuildRSOopClosure: public ExtendedOopClosure {
apetrusenko@2152 195 HeapRegion* _from;
johnc@6958 196 G1RemSet* _rs;
vkempik@23855 197 uint _worker_i;
ysr@3262 198
ysr@3262 199 template <class T> void do_oop_work(T* p);
ysr@3262 200
apetrusenko@2152 201 public:
tschatzl@46575 202 RebuildRSOopClosure(G1RemSet* rs, uint worker_i = 0) :
johnc@7385 203 _from(NULL), _rs(rs), _worker_i(worker_i)
johnc@7385 204 {}
apetrusenko@2152 205
apetrusenko@2152 206 void set_from(HeapRegion* from) {
apetrusenko@2152 207 assert(from != NULL, "from region must be non-NULL");
apetrusenko@2152 208 _from = from;
apetrusenko@2152 209 }
apetrusenko@2152 210
ysr@3262 211 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
ysr@3262 212 virtual void do_oop(oop* p) { do_oop_work(p); }
apetrusenko@2152 213 };
johnc@6247 214
pliden@30764 215 #endif // SHARE_VM_GC_G1_G1REMSET_HPP