43 class CodeBlobClosure;
44 class G1CollectedHeap;
45 class G1CMBitMap;
46 class G1HotCardCache;
47 class G1RemSetScanState;
48 class G1ParScanThreadState;
49 class G1Policy;
50 class G1ScanObjsDuringScanRSClosure;
51 class G1ScanObjsDuringUpdateRSClosure;
52 class HeapRegionClaimer;
53
54 // A G1RemSet in which each heap region has a rem set that records the
55 // external heap references into it. Uses a mod ref bs to track updates,
56 // so that they can be used to update the individual region remsets.
57 class G1RemSet: public CHeapObj<mtGC> {
58 private:
59 G1RemSetScanState* _scan_state;
60
61 G1RemSetSummary _prev_period_summary;
62
63 // Scan all remembered sets of the collection set for references into the collection
64 // set.
65 void scan_rem_set(G1ParScanThreadState* pss, uint worker_i);
66
67 // Flush remaining refinement buffers for cross-region references to either evacuate references
68 // into the collection set or update the remembered set.
69 void update_rem_set(G1ParScanThreadState* pss, uint worker_i);
70
71 G1CollectedHeap* _g1h;
72 size_t _num_conc_refined_cards; // Number of cards refined concurrently to the mutator.
73
74 G1CardTable* _ct;
75 G1Policy* _g1p;
76 G1HotCardCache* _hot_card_cache;
77
78 public:
79
80 typedef CardTable::CardValue CardValue;
81 // Gives an approximation on how many threads can be expected to add records to
82 // a remembered set in parallel. This can be used for sizing data structures to
83 // decrease performance losses due to data structure sharing.
84 // Examples for quantities that influence this value are the maximum number of
85 // mutator threads, maximum number of concurrent refinement or GC threads.
86 static uint num_par_rem_sets();
87
88 // Initialize data that depends on the heap size being known.
89 void initialize(size_t capacity, uint max_regions);
90
91 G1RemSet(G1CollectedHeap* g1h,
92 G1CardTable* ct,
93 G1HotCardCache* hot_card_cache);
94 ~G1RemSet();
95
96 // Process all oops in the collection set from the cards in the refinement buffers and
97 // remembered sets using pss.
98 //
99 // Further applies heap_region_codeblobs on the oops of the unmarked nmethods on the strong code
100 // roots list for each region in the collection set.
101 void oops_into_collection_set_do(G1ParScanThreadState* pss, uint worker_i);
102
103 // Prepare for and cleanup after an oops_into_collection_set_do
104 // call. Must call each of these once before and after (in sequential
105 // code) any thread calls oops_into_collection_set_do.
106 void prepare_for_oops_into_collection_set_do();
107 void cleanup_after_oops_into_collection_set_do();
108
109 G1RemSetScanState* scan_state() const { return _scan_state; }
110
111 // Refine the card corresponding to "card_ptr". Safe to be called concurrently
112 // to the mutator.
113 void refine_card_concurrently(CardValue* card_ptr,
114 uint worker_i);
115
116 // Refine the card corresponding to "card_ptr", applying the given closure to
117 // all references found. Must only be called during gc.
118 // Returns whether the card has been scanned.
119 bool refine_card_during_gc(CardValue* card_ptr, G1ScanObjsDuringUpdateRSClosure* update_rs_cl);
120
121 // Print accumulated summary info from the start of the VM.
127 size_t num_conc_refined_cards() const { return _num_conc_refined_cards; }
128
129 // Rebuilds the remembered set by scanning from bottom to TARS for all regions
130 // using the given work gang.
131 void rebuild_rem_set(G1ConcurrentMark* cm, WorkGang* workers, uint worker_id_offset);
132 };
133
134 class G1ScanRSForRegionClosure : public HeapRegionClosure {
135 G1CollectedHeap* _g1h;
136 G1CardTable *_ct;
137
138 G1ParScanThreadState* _pss;
139 G1ScanObjsDuringScanRSClosure* _scan_objs_on_card_cl;
140
141 G1RemSetScanState* _scan_state;
142
143 G1GCPhaseTimes::GCParPhases _phase;
144
145 uint _worker_i;
146
147 size_t _cards_scanned;
148 size_t _cards_claimed;
149 size_t _cards_skipped;
150
151 Tickspan _rem_set_root_scan_time;
152 Tickspan _rem_set_trim_partially_time;
153
154 Tickspan _strong_code_root_scan_time;
155 Tickspan _strong_code_trim_partially_time;
156
157 void claim_card(size_t card_index, const uint region_idx_for_card);
158 void scan_card(MemRegion mr, uint region_idx_for_card);
159
160 void scan_rem_set_roots(HeapRegion* r);
161 void scan_strong_code_roots(HeapRegion* r);
162 public:
163 G1ScanRSForRegionClosure(G1RemSetScanState* scan_state,
164 G1ScanObjsDuringScanRSClosure* scan_obj_on_card,
165 G1ParScanThreadState* pss,
166 G1GCPhaseTimes::GCParPhases phase,
167 uint worker_i);
168
169 bool do_heap_region(HeapRegion* r);
170
171 Tickspan rem_set_root_scan_time() const { return _rem_set_root_scan_time; }
172 Tickspan rem_set_trim_partially_time() const { return _rem_set_trim_partially_time; }
173
174 Tickspan strong_code_root_scan_time() const { return _strong_code_root_scan_time; }
175 Tickspan strong_code_root_trim_partially_time() const { return _strong_code_trim_partially_time; }
176
177 size_t cards_scanned() const { return _cards_scanned; }
178 size_t cards_claimed() const { return _cards_claimed; }
179 size_t cards_skipped() const { return _cards_skipped; }
180 };
181
182 #endif // SHARE_GC_G1_G1REMSET_HPP
|
43 class CodeBlobClosure;
44 class G1CollectedHeap;
45 class G1CMBitMap;
46 class G1HotCardCache;
47 class G1RemSetScanState;
48 class G1ParScanThreadState;
49 class G1Policy;
50 class G1ScanObjsDuringScanRSClosure;
51 class G1ScanObjsDuringUpdateRSClosure;
52 class HeapRegionClaimer;
53
54 // A G1RemSet in which each heap region has a rem set that records the
55 // external heap references into it. Uses a mod ref bs to track updates,
56 // so that they can be used to update the individual region remsets.
57 class G1RemSet: public CHeapObj<mtGC> {
58 private:
59 G1RemSetScanState* _scan_state;
60
61 G1RemSetSummary _prev_period_summary;
62
63 G1CollectedHeap* _g1h;
64 size_t _num_conc_refined_cards; // Number of cards refined concurrently to the mutator.
65
66 G1CardTable* _ct;
67 G1Policy* _g1p;
68 G1HotCardCache* _hot_card_cache;
69
70 public:
71
72 typedef CardTable::CardValue CardValue;
73 // Gives an approximation on how many threads can be expected to add records to
74 // a remembered set in parallel. This can be used for sizing data structures to
75 // decrease performance losses due to data structure sharing.
76 // Examples for quantities that influence this value are the maximum number of
77 // mutator threads, maximum number of concurrent refinement or GC threads.
78 static uint num_par_rem_sets();
79
80 // Initialize data that depends on the heap size being known.
81 void initialize(size_t capacity, uint max_regions);
82
83 G1RemSet(G1CollectedHeap* g1h,
84 G1CardTable* ct,
85 G1HotCardCache* hot_card_cache);
86 ~G1RemSet();
87
88 // Scan all remembered sets of the collection set for references into the collection
89 // set.
90 // Further applies heap_region_codeblobs on the oops of the unmarked nmethods on the strong code
91 // roots list for each region in the collection set.
92 void scan_rem_set(G1ParScanThreadState* pss,
93 uint worker_i,
94 G1GCPhaseTimes::GCParPhases scan_phase,
95 G1GCPhaseTimes::GCParPhases objcopy_phase,
96 G1GCPhaseTimes::GCParPhases coderoots_phase);
97
98 // Flush remaining refinement buffers for cross-region references to either evacuate references
99 // into the collection set or update the remembered set.
100 void update_rem_set(G1ParScanThreadState* pss, uint worker_i);
101
102 // Prepare for and cleanup after an oops_into_collection_set_do
103 // call. Must call each of these once before and after (in sequential
104 // code) any thread calls oops_into_collection_set_do.
105 void prepare_for_oops_into_collection_set_do();
106 void cleanup_after_oops_into_collection_set_do();
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, G1ScanObjsDuringUpdateRSClosure* update_rs_cl);
119
120 // Print accumulated summary info from the start of the VM.
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 class G1ScanRSForRegionClosure : public HeapRegionClosure {
134 G1CollectedHeap* _g1h;
135 G1CardTable *_ct;
136
137 G1ParScanThreadState* _pss;
138 G1ScanObjsDuringScanRSClosure* _scan_objs_on_card_cl;
139
140 G1RemSetScanState* _scan_state;
141
142 G1GCPhaseTimes::GCParPhases _phase;
143
144 uint _worker_i;
145
146 size_t _opt_refs_scanned;
147 size_t _opt_refs_memory_used;
148
149 size_t _cards_scanned;
150 size_t _cards_claimed;
151 size_t _cards_skipped;
152
153 Tickspan _rem_set_root_scan_time;
154 Tickspan _rem_set_trim_partially_time;
155
156 Tickspan _strong_code_root_scan_time;
157 Tickspan _strong_code_trim_partially_time;
158
159 void claim_card(size_t card_index, const uint region_idx_for_card);
160 void scan_card(MemRegion mr, uint region_idx_for_card);
161
162 void scan_opt_rem_set_roots(HeapRegion* r);
163 void scan_rem_set_roots(HeapRegion* r);
164 void scan_strong_code_roots(HeapRegion* r);
165 public:
166 G1ScanRSForRegionClosure(G1RemSetScanState* scan_state,
167 G1ScanObjsDuringScanRSClosure* scan_obj_on_card,
168 G1ParScanThreadState* pss,
169 G1GCPhaseTimes::GCParPhases phase,
170 uint worker_i);
171
172 bool do_heap_region(HeapRegion* r);
173
174 Tickspan rem_set_root_scan_time() const { return _rem_set_root_scan_time; }
175 Tickspan rem_set_trim_partially_time() const { return _rem_set_trim_partially_time; }
176
177 Tickspan strong_code_root_scan_time() const { return _strong_code_root_scan_time; }
178 Tickspan strong_code_root_trim_partially_time() const { return _strong_code_trim_partially_time; }
179
180 size_t cards_scanned() const { return _cards_scanned; }
181 size_t cards_claimed() const { return _cards_claimed; }
182 size_t cards_skipped() const { return _cards_skipped; }
183
184 size_t opt_refs_scanned() const { return _opt_refs_scanned; }
185 size_t opt_refs_memory_used() const { return _opt_refs_memory_used; }
186 };
187
188 #endif // SHARE_GC_G1_G1REMSET_HPP
|