1 /*
2 * Copyright (c) 2001, 2015, 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 *
26 #define SHARE_VM_GC_G1_G1REMSET_HPP
27
28 #include "gc/g1/dirtyCardQueue.hpp"
29 #include "gc/g1/g1CardLiveData.hpp"
30 #include "gc/g1/g1RemSetSummary.hpp"
31 #include "gc/g1/heapRegion.hpp"
32 #include "memory/allocation.hpp"
33 #include "memory/iterator.hpp"
34
35 // A G1RemSet provides ways of iterating over pointers into a selected
36 // collection set.
37
38 class BitMap;
39 class CardTableModRefBS;
40 class G1BlockOffsetTable;
41 class ConcurrentG1Refine;
42 class CodeBlobClosure;
43 class G1CollectedHeap;
44 class G1CollectorPolicy;
45 class G1ParPushHeapRSClosure;
46 class G1SATBCardTableModRefBS;
47 class HeapRegionClaimer;
48
49 // A G1RemSet in which each heap region has a rem set that records the
50 // external heap references into it. Uses a mod ref bs to track updates,
51 // so that they can be used to update the individual region remsets.
52 class G1RemSet: public CHeapObj<mtGC> {
53 private:
54 G1CardLiveData _card_live_data;
55
56 G1RemSetSummary _prev_period_summary;
57
58 // A DirtyCardQueueSet that is used to hold cards that contain
59 // references into the current collection set. This is used to
60 // update the remembered sets of the regions in the collection
61 // set in the event of an evacuation failure.
62 DirtyCardQueueSet _into_cset_dirty_card_queue_set;
63
64 protected:
65 G1CollectedHeap* _g1;
66 size_t _conc_refine_cards;
67 uint n_workers();
68
69 protected:
70 CardTableModRefBS* _ct_bs;
71 G1CollectorPolicy* _g1p;
72
73 ConcurrentG1Refine* _cg1r;
74
75 // Used for caching the closure that is responsible for scanning
76 // references into the collection set.
77 G1ParPushHeapRSClosure** _cset_rs_update_cl;
78
79 public:
80 // Gives an approximation on how many threads can be expected to add records to
81 // a remembered set in parallel. This can be used for sizing data structures to
82 // decrease performance losses due to data structure sharing.
83 // Examples for quantities that influence this value are the maximum number of
84 // mutator threads, maximum number of concurrent refinement or GC threads.
85 static uint num_par_rem_sets();
86
87 // Initialize data that depends on the heap size being known.
88 void initialize(size_t capacity, uint max_regions);
89
90 // This is called to reset dual hash tables after the gc pause
91 // is finished and the initial hash table is no longer being
92 // scanned.
93 void cleanupHRRS();
94
95 G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
96 ~G1RemSet();
97
98 // Invoke "blk->do_oop" on all pointers into the collection set
99 // from objects in regions outside the collection set (having
100 // invoked "blk->set_region" to set the "from" region correctly
101 // beforehand.)
102 //
103 // Apply non_heap_roots on the oops of the unmarked nmethods
104 // on the strong code roots list for each region in the
105 // collection set.
106 //
107 // The "worker_i" param is for the parallel case where the id
108 // of the worker thread calling this function can be helpful in
109 // partitioning the work to be done. It should be the same as
110 // the "i" passed to the calling thread's work(i) function.
111 // In the sequential case this param will be ignored.
112 //
113 // Returns the number of cards scanned while looking for pointers
114 // into the collection set.
115 size_t oops_into_collection_set_do(G1ParPushHeapRSClosure* blk,
116 CodeBlobClosure* heap_region_codeblobs,
117 uint worker_i);
118
119 // Prepare for and cleanup after an oops_into_collection_set_do
120 // call. Must call each of these once before and after (in sequential
121 // code) any threads call oops_into_collection_set_do. (This offers an
122 // opportunity to sequential setup and teardown of structures needed by a
123 // parallel iteration over the CS's RS.)
124 void prepare_for_oops_into_collection_set_do();
125 void cleanup_after_oops_into_collection_set_do();
126
127 size_t scanRS(G1ParPushHeapRSClosure* oc,
128 CodeBlobClosure* heap_region_codeblobs,
129 uint worker_i);
130
131 void updateRS(DirtyCardQueue* into_cset_dcq, uint worker_i);
132
133 CardTableModRefBS* ct_bs() { return _ct_bs; }
134
135 // Record, if necessary, the fact that *p (where "p" is in region "from",
136 // which is required to be non-NULL) has changed to a new non-NULL value.
137 template <class T> void par_write_ref(HeapRegion* from, T* p, uint tid);
138
139 // Requires "region_bm" and "card_bm" to be bitmaps with 1 bit per region
140 // or card, respectively, such that a region or card with a corresponding
141 // 0 bit contains no part of any live object. Eliminates any remembered
142 // set entries that correspond to dead heap ranges. "worker_num" is the
143 // parallel thread id of the current thread, and "hrclaimer" is the
144 // HeapRegionClaimer that should be used.
145 void scrub(uint worker_num, HeapRegionClaimer* hrclaimer);
146
147 // Refine the card corresponding to "card_ptr".
148 // If check_for_refs_into_cset is true, a true result is returned
149 // if the given card contains oops that have references into the
150 // current collection set.
151 virtual bool refine_card(jbyte* card_ptr,
152 uint worker_i,
153 bool check_for_refs_into_cset);
154
155 // Print accumulated summary info from the start of the VM.
156 virtual void print_summary_info();
157
158 // Print accumulated summary info from the last time called.
159 virtual void print_periodic_summary_info(const char* header, uint period_count);
160
161 // Prepare remembered set for verification.
162 virtual void prepare_for_verify();
163
164 size_t conc_refine_cards() const {
165 return _conc_refine_cards;
166 }
167
168 void create_card_live_data(WorkGang* workers, G1CMBitMap* mark_bitmap);
169 void finalize_card_live_data(WorkGang* workers, G1CMBitMap* mark_bitmap);
170
171 // Verify that the liveness count data created concurrently matches one created
172 // during this safepoint.
173 void verify_card_live_data(WorkGang* workers, G1CMBitMap* actual_bitmap);
174
175 void clear_card_live_data(WorkGang* workers);
176
177 #ifdef ASSERT
178 void verify_card_live_data_is_clear();
179 #endif
180 };
181
182 class ScanRSClosure : public HeapRegionClosure {
183 size_t _cards_done, _cards;
184 G1CollectedHeap* _g1h;
185
186 G1ParPushHeapRSClosure* _oc;
187 CodeBlobClosure* _code_root_cl;
188
189 G1BlockOffsetTable* _bot;
190 G1SATBCardTableModRefBS *_ct_bs;
191
192 double _strong_code_root_scan_time_sec;
193 uint _worker_i;
194 size_t _block_size;
195 bool _try_claimed;
196
197 public:
198 ScanRSClosure(G1ParPushHeapRSClosure* oc,
199 CodeBlobClosure* code_root_cl,
200 uint worker_i);
201
202 bool doHeapRegion(HeapRegion* r);
203
204 double strong_code_root_scan_time_sec() {
205 return _strong_code_root_scan_time_sec;
206 }
207 size_t cards_done() { return _cards_done;}
208 size_t cards_looked_up() { return _cards;}
209 void set_try_claimed() { _try_claimed = true; }
210 private:
211 void scanCard(size_t index, HeapRegion *r);
212 void printCard(HeapRegion* card_region, size_t card_index,
213 HeapWord* card_start);
214 void scan_strong_code_roots(HeapRegion* r);
215 };
216
217 class UpdateRSOopClosure: public ExtendedOopClosure {
218 HeapRegion* _from;
219 G1RemSet* _rs;
220 uint _worker_i;
221
222 template <class T> void do_oop_work(T* p);
223
224 public:
225 UpdateRSOopClosure(G1RemSet* rs, uint worker_i = 0) :
226 _from(NULL), _rs(rs), _worker_i(worker_i)
227 {}
228
229 void set_from(HeapRegion* from) {
230 assert(from != NULL, "from region must be non-NULL");
231 _from = from;
232 }
233
234 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
|
1 /*
2 * Copyright (c) 2001, 2016, 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 *
26 #define SHARE_VM_GC_G1_G1REMSET_HPP
27
28 #include "gc/g1/dirtyCardQueue.hpp"
29 #include "gc/g1/g1CardLiveData.hpp"
30 #include "gc/g1/g1RemSetSummary.hpp"
31 #include "gc/g1/heapRegion.hpp"
32 #include "memory/allocation.hpp"
33 #include "memory/iterator.hpp"
34
35 // A G1RemSet provides ways of iterating over pointers into a selected
36 // collection set.
37
38 class BitMap;
39 class CardTableModRefBS;
40 class G1BlockOffsetTable;
41 class ConcurrentG1Refine;
42 class CodeBlobClosure;
43 class G1CollectedHeap;
44 class G1CollectorPolicy;
45 class G1ParPushHeapRSClosure;
46 class G1RemSetScanState;
47 class G1SATBCardTableModRefBS;
48 class HeapRegionClaimer;
49
50 // A G1RemSet in which each heap region has a rem set that records the
51 // external heap references into it. Uses a mod ref bs to track updates,
52 // so that they can be used to update the individual region remsets.
53 class G1RemSet: public CHeapObj<mtGC> {
54 private:
55 G1RemSetScanState* _scan_state;
56 G1CardLiveData _card_live_data;
57
58 G1RemSetSummary _prev_period_summary;
59
60 // A DirtyCardQueueSet that is used to hold cards that contain
61 // references into the current collection set. This is used to
62 // update the remembered sets of the regions in the collection
63 // set in the event of an evacuation failure.
64 DirtyCardQueueSet _into_cset_dirty_card_queue_set;
65
66 protected:
67 G1CollectedHeap* _g1;
68 size_t _conc_refine_cards;
69 uint n_workers();
70
71 protected:
72 CardTableModRefBS* _ct_bs;
73 G1CollectorPolicy* _g1p;
74
75 ConcurrentG1Refine* _cg1r;
76
77 public:
78 // Gives an approximation on how many threads can be expected to add records to
79 // a remembered set in parallel. This can be used for sizing data structures to
80 // decrease performance losses due to data structure sharing.
81 // Examples for quantities that influence this value are the maximum number of
82 // mutator threads, maximum number of concurrent refinement or GC threads.
83 static uint num_par_rem_sets();
84
85 // Initialize data that depends on the heap size being known.
86 void initialize(size_t capacity, uint max_regions);
87
88 // This is called to reset dual hash tables after the gc pause
89 // is finished and the initial hash table is no longer being
90 // scanned.
91 void cleanupHRRS();
92
93 G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
94 ~G1RemSet();
95
96 // Invoke "cl->do_oop" on all pointers into the collection set
97 // from objects in regions outside the collection set (having
98 // invoked "cl->set_region" to set the "from" region correctly
99 // beforehand.)
100 //
101 // Apply non_heap_roots on the oops of the unmarked nmethods
102 // on the strong code roots list for each region in the
103 // collection set.
104 //
105 // The "worker_i" param is for the parallel case where the id
106 // of the worker thread calling this function can be helpful in
107 // partitioning the work to be done. It should be the same as
108 // the "i" passed to the calling thread's work(i) function.
109 // In the sequential case this param will be ignored.
110 //
111 // Returns the number of cards scanned while looking for pointers
112 // into the collection set.
113 size_t oops_into_collection_set_do(G1ParPushHeapRSClosure* cl,
114 CodeBlobClosure* heap_region_codeblobs,
115 uint worker_i);
116
117 // Prepare for and cleanup after an oops_into_collection_set_do
118 // call. Must call each of these once before and after (in sequential
119 // code) any threads call oops_into_collection_set_do. (This offers an
120 // opportunity to sequential setup and teardown of structures needed by a
121 // parallel iteration over the CS's RS.)
122 void prepare_for_oops_into_collection_set_do();
123 void cleanup_after_oops_into_collection_set_do();
124
125 size_t scan_rem_set(G1ParPushHeapRSClosure* oops_in_heap_closure,
126 CodeBlobClosure* heap_region_codeblobs,
127 uint worker_i);
128
129 G1RemSetScanState* scan_state() const { return _scan_state; }
130
131 // Flush remaining refinement buffers into the remembered set,
132 // applying oops_in_heap_closure on the references that point into the heap.
133 void update_rem_set(DirtyCardQueue* into_cset_dcq, G1ParPushHeapRSClosure* oops_in_heap_closure, uint worker_i);
134
135 // Record, if necessary, the fact that *p (where "p" is in region "from",
136 // which is required to be non-NULL) has changed to a new non-NULL value.
137 template <class T> void par_write_ref(HeapRegion* from, T* p, uint tid);
138
139 // Requires "region_bm" and "card_bm" to be bitmaps with 1 bit per region
140 // or card, respectively, such that a region or card with a corresponding
141 // 0 bit contains no part of any live object. Eliminates any remembered
142 // set entries that correspond to dead heap ranges. "worker_num" is the
143 // parallel thread id of the current thread, and "hrclaimer" is the
144 // HeapRegionClaimer that should be used.
145 void scrub(uint worker_num, HeapRegionClaimer* hrclaimer);
146
147 // Refine the card corresponding to "card_ptr".
148 // If oops_in_heap_closure is not NULL, a true result is returned
149 // if the given card contains oops that have references into the
150 // current collection set.
151 virtual bool refine_card(jbyte* card_ptr,
152 uint worker_i,
153 G1ParPushHeapRSClosure* oops_in_heap_closure);
154
155 // Print accumulated summary info from the start of the VM.
156 virtual void print_summary_info();
157
158 // Print accumulated summary info from the last time called.
159 virtual void print_periodic_summary_info(const char* header, uint period_count);
160
161 // Prepare remembered set for verification.
162 virtual void prepare_for_verify();
163
164 size_t conc_refine_cards() const {
165 return _conc_refine_cards;
166 }
167
168 void create_card_live_data(WorkGang* workers, G1CMBitMap* mark_bitmap);
169 void finalize_card_live_data(WorkGang* workers, G1CMBitMap* mark_bitmap);
170
171 // Verify that the liveness count data created concurrently matches one created
172 // during this safepoint.
173 void verify_card_live_data(WorkGang* workers, G1CMBitMap* actual_bitmap);
174
175 void clear_card_live_data(WorkGang* workers);
176
177 #ifdef ASSERT
178 void verify_card_live_data_is_clear();
179 #endif
180 };
181
182 class G1ScanRSClosure : public HeapRegionClosure {
183 G1RemSetScanState* _scan_state;
184
185 size_t _cards_done;
186 size_t _cards;
187 G1CollectedHeap* _g1h;
188
189 G1ParPushHeapRSClosure* _push_heap_cl;
190 CodeBlobClosure* _code_root_cl;
191
192 G1BlockOffsetTable* _bot;
193 G1SATBCardTableModRefBS *_ct_bs;
194
195 double _strong_code_root_scan_time_sec;
196 uint _worker_i;
197 size_t _block_size;
198
199 void scan_card(size_t index, HeapRegion *r);
200 void scan_strong_code_roots(HeapRegion* r);
201 public:
202 G1ScanRSClosure(G1RemSetScanState* scan_state,
203 G1ParPushHeapRSClosure* push_heap_cl,
204 CodeBlobClosure* code_root_cl,
205 uint worker_i);
206
207 bool doHeapRegion(HeapRegion* r);
208
209 double strong_code_root_scan_time_sec() {
210 return _strong_code_root_scan_time_sec;
211 }
212
213 size_t cards_done() { return _cards_done;}
214 size_t cards_looked_up() { return _cards;}
215 };
216
217 class UpdateRSOopClosure: public ExtendedOopClosure {
218 HeapRegion* _from;
219 G1RemSet* _rs;
220 uint _worker_i;
221
222 template <class T> void do_oop_work(T* p);
223
224 public:
225 UpdateRSOopClosure(G1RemSet* rs, uint worker_i = 0) :
226 _from(NULL), _rs(rs), _worker_i(worker_i)
227 {}
228
229 void set_from(HeapRegion* from) {
230 assert(from != NULL, "from region must be non-NULL");
231 _from = from;
232 }
233
234 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
|