1/*
2 * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_GC_G1_G1REMSET_HPP
26#define SHARE_GC_G1_G1REMSET_HPP
27
28#include "gc/g1/g1CardTable.hpp"
29#include "gc/g1/g1OopClosures.hpp"
30#include "gc/g1/g1GCPhaseTimes.hpp"
31#include "gc/g1/g1RemSetSummary.hpp"
32#include "gc/g1/heapRegion.hpp"
33#include "memory/allocation.hpp"
34#include "memory/iterator.hpp"
35#include "utilities/ticks.hpp"
36
37// A G1RemSet provides ways of iterating over pointers into a selected
38// collection set.
39
40class BitMap;
41class CardTableBarrierSet;
42class G1BlockOffsetTable;
43class CodeBlobClosure;
44class G1CollectedHeap;
45class G1CMBitMap;
46class G1HotCardCache;
47class G1RemSetScanState;
48class G1ParScanThreadState;
49class G1Policy;
50class G1ScanCardClosure;
51class HeapRegionClaimer;
52
53// A G1RemSet in which each heap region has a rem set that records the
54// external heap references into it. Uses a mod ref bs to track updates,
55// so that they can be used to update the individual region remsets.
56class G1RemSet: public CHeapObj<mtGC> {
57private:
58 G1RemSetScanState* _scan_state;
59
60 G1RemSetSummary _prev_period_summary;
61
62 G1CollectedHeap* _g1h;
63 size_t _num_conc_refined_cards; // Number of cards refined concurrently to the mutator.
64
65 G1CardTable* _ct;
66 G1Policy* _g1p;
67 G1HotCardCache* _hot_card_cache;
68
69public:
70
71 typedef CardTable::CardValue CardValue;
72 // Gives an approximation on how many threads can be expected to add records to
73 // a remembered set in parallel. This can be used for sizing data structures to
74 // decrease performance losses due to data structure sharing.
75 // Examples for quantities that influence this value are the maximum number of
76 // mutator threads, maximum number of concurrent refinement or GC threads.
77 static uint num_par_rem_sets();
78
79 // Initialize data that depends on the heap size being known.
80 void initialize(size_t capacity, uint max_regions);
81
82 G1RemSet(G1CollectedHeap* g1h,
83 G1CardTable* ct,
84 G1HotCardCache* hot_card_cache);
85 ~G1RemSet();
86
87 // Scan all remembered sets of the collection set for references into the collection
88 // set.
89 // Further applies heap_region_codeblobs on the oops of the unmarked nmethods on the strong code
90 // roots list for each region in the collection set.
91 void scan_rem_set(G1ParScanThreadState* pss,
92 uint worker_i,
93 G1GCPhaseTimes::GCParPhases scan_phase,
94 G1GCPhaseTimes::GCParPhases objcopy_phase,
95 G1GCPhaseTimes::GCParPhases coderoots_phase);
96
97 // Flush remaining refinement buffers for cross-region references to either evacuate references
98 // into the collection set or update the remembered set.
99 void update_rem_set(G1ParScanThreadState* pss, uint worker_i);
100
101 // Prepare for and cleanup after scanning the remembered sets. Must be called
102 // once before and after in sequential code.
103 void prepare_for_scan_rem_set();
104 void cleanup_after_scan_rem_set();
105 // Prepares the given region for remembered set scanning.
106 void prepare_for_scan_rem_set(uint region_idx);
107
108 G1RemSetScanState* scan_state() const { return _scan_state; }
109
110 // Refine the card corresponding to "card_ptr". Safe to be called concurrently
111 // to the mutator.
112 void refine_card_concurrently(CardValue* card_ptr,
113 uint worker_i);
114
115 // Refine the card corresponding to "card_ptr", applying the given closure to
116 // all references found. Must only be called during gc.
117 // Returns whether the card has been scanned.
118 bool refine_card_during_gc(CardValue* card_ptr, G1ScanCardClosure* update_rs_cl);
119
120 // Print accumulated summary info from the start of the VM.
121 void print_summary_info();
122
123 // Print accumulated summary info from the last time called.
124 void print_periodic_summary_info(const char* header, uint period_count);
125
126 size_t num_conc_refined_cards() const { return _num_conc_refined_cards; }
127
128 // Rebuilds the remembered set by scanning from bottom to TARS for all regions
129 // using the given work gang.
130 void rebuild_rem_set(G1ConcurrentMark* cm, WorkGang* workers, uint worker_id_offset);
131};
132
133#endif // SHARE_GC_G1_G1REMSET_HPP
134