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_VM_GC_G1_G1REMSET_HPP
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 CodeBlobClosure;
42 class G1CollectedHeap;
43 class G1HotCardCache;
44 class G1ParPushHeapRSClosure;
45 class G1RemSetScanState;
46 class G1Policy;
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 G1Policy* _g1p;
74 G1HotCardCache* _hot_card_cache;
75
76 public:
77 // Gives an approximation on how many threads can be expected to add records to
78 // a remembered set in parallel. This can be used for sizing data structures to
79 // decrease performance losses due to data structure sharing.
80 // Examples for quantities that influence this value are the maximum number of
81 // mutator threads, maximum number of concurrent refinement or GC threads.
82 static uint num_par_rem_sets();
83
84 // Initialize data that depends on the heap size being known.
85 void initialize(size_t capacity, uint max_regions);
86
87 // This is called to reset dual hash tables after the gc pause
88 // is finished and the initial hash table is no longer being
89 // scanned.
90 void cleanupHRRS();
91
92 G1RemSet(G1CollectedHeap* g1,
93 CardTableModRefBS* ct_bs,
94 G1HotCardCache* hot_card_cache);
95 ~G1RemSet();
96
97 // Invoke "cl->do_oop" on all pointers into the collection set
98 // from objects in regions outside the collection set (having
99 // invoked "cl->set_region" to set the "from" region correctly
100 // beforehand.)
101 //
102 // Apply non_heap_roots on the oops of the unmarked nmethods
103 // on the strong code roots list for each region in the
104 // collection set.
105 //
106 // The "worker_i" param is for the parallel case where the id
107 // of the worker thread calling this function can be helpful in
108 // partitioning the work to be done. It should be the same as
109 // the "i" passed to the calling thread's work(i) function.
110 // In the sequential case this param will be ignored.
111 //
112 // Returns the number of cards scanned while looking for pointers
113 // into the collection set.
174 void verify_card_live_data(WorkGang* workers, G1CMBitMap* actual_bitmap);
175
176 void clear_card_live_data(WorkGang* workers);
177
178 #ifdef ASSERT
179 void verify_card_live_data_is_clear();
180 #endif
181 };
182
183 class G1ScanRSClosure : public HeapRegionClosure {
184 G1RemSetScanState* _scan_state;
185
186 size_t _cards_done;
187 size_t _cards;
188 G1CollectedHeap* _g1h;
189
190 G1ParPushHeapRSClosure* _push_heap_cl;
191 CodeBlobClosure* _code_root_cl;
192
193 G1BlockOffsetTable* _bot;
194 G1SATBCardTableModRefBS *_ct_bs;
195
196 double _strong_code_root_scan_time_sec;
197 uint _worker_i;
198 size_t _block_size;
199
200 void scan_card(size_t index, HeapRegion *r);
201 void scan_strong_code_roots(HeapRegion* r);
202 public:
203 G1ScanRSClosure(G1RemSetScanState* scan_state,
204 G1ParPushHeapRSClosure* push_heap_cl,
205 CodeBlobClosure* code_root_cl,
206 uint worker_i);
207
208 bool doHeapRegion(HeapRegion* r);
209
210 double strong_code_root_scan_time_sec() {
211 return _strong_code_root_scan_time_sec;
212 }
213
214 size_t cards_done() { return _cards_done;}
|
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_VM_GC_G1_G1REMSET_HPP
26 #define SHARE_VM_GC_G1_G1REMSET_HPP
27
28 #include "gc/g1/dirtyCardQueue.hpp"
29 #include "gc/g1/g1CardTable.hpp"
30 #include "gc/g1/g1CardLiveData.hpp"
31 #include "gc/g1/g1RemSetSummary.hpp"
32 #include "gc/g1/heapRegion.hpp"
33 #include "memory/allocation.hpp"
34 #include "memory/iterator.hpp"
35
36 // A G1RemSet provides ways of iterating over pointers into a selected
37 // collection set.
38
39 class BitMap;
40 class CardTableModRefBS;
41 class G1BlockOffsetTable;
42 class CodeBlobClosure;
43 class G1CollectedHeap;
44 class G1HotCardCache;
45 class G1ParPushHeapRSClosure;
46 class G1RemSetScanState;
47 class G1Policy;
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 G1CardTable* _ct;
73 G1Policy* _g1p;
74 G1HotCardCache* _hot_card_cache;
75
76 public:
77 // Gives an approximation on how many threads can be expected to add records to
78 // a remembered set in parallel. This can be used for sizing data structures to
79 // decrease performance losses due to data structure sharing.
80 // Examples for quantities that influence this value are the maximum number of
81 // mutator threads, maximum number of concurrent refinement or GC threads.
82 static uint num_par_rem_sets();
83
84 // Initialize data that depends on the heap size being known.
85 void initialize(size_t capacity, uint max_regions);
86
87 // This is called to reset dual hash tables after the gc pause
88 // is finished and the initial hash table is no longer being
89 // scanned.
90 void cleanupHRRS();
91
92 G1RemSet(G1CollectedHeap* g1,
93 G1CardTable* ct,
94 G1HotCardCache* hot_card_cache);
95 ~G1RemSet();
96
97 // Invoke "cl->do_oop" on all pointers into the collection set
98 // from objects in regions outside the collection set (having
99 // invoked "cl->set_region" to set the "from" region correctly
100 // beforehand.)
101 //
102 // Apply non_heap_roots on the oops of the unmarked nmethods
103 // on the strong code roots list for each region in the
104 // collection set.
105 //
106 // The "worker_i" param is for the parallel case where the id
107 // of the worker thread calling this function can be helpful in
108 // partitioning the work to be done. It should be the same as
109 // the "i" passed to the calling thread's work(i) function.
110 // In the sequential case this param will be ignored.
111 //
112 // Returns the number of cards scanned while looking for pointers
113 // into the collection set.
174 void verify_card_live_data(WorkGang* workers, G1CMBitMap* actual_bitmap);
175
176 void clear_card_live_data(WorkGang* workers);
177
178 #ifdef ASSERT
179 void verify_card_live_data_is_clear();
180 #endif
181 };
182
183 class G1ScanRSClosure : public HeapRegionClosure {
184 G1RemSetScanState* _scan_state;
185
186 size_t _cards_done;
187 size_t _cards;
188 G1CollectedHeap* _g1h;
189
190 G1ParPushHeapRSClosure* _push_heap_cl;
191 CodeBlobClosure* _code_root_cl;
192
193 G1BlockOffsetTable* _bot;
194 G1CardTable *_ct;
195
196 double _strong_code_root_scan_time_sec;
197 uint _worker_i;
198 size_t _block_size;
199
200 void scan_card(size_t index, HeapRegion *r);
201 void scan_strong_code_roots(HeapRegion* r);
202 public:
203 G1ScanRSClosure(G1RemSetScanState* scan_state,
204 G1ParPushHeapRSClosure* push_heap_cl,
205 CodeBlobClosure* code_root_cl,
206 uint worker_i);
207
208 bool doHeapRegion(HeapRegion* r);
209
210 double strong_code_root_scan_time_sec() {
211 return _strong_code_root_scan_time_sec;
212 }
213
214 size_t cards_done() { return _cards_done;}
|