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/g1RemSetSummary.hpp"
29
30 // A G1RemSet provides ways of iterating over pointers into a selected
31 // collection set.
32
33 class G1CollectedHeap;
34 class ConcurrentG1Refine;
35 class G1ParPushHeapRSClosure;
36
37 // A G1RemSet in which each heap region has a rem set that records the
38 // external heap references into it. Uses a mod ref bs to track updates,
39 // so that they can be used to update the individual region remsets.
40
41 class G1RemSet: public CHeapObj<mtGC> {
42 private:
43 G1RemSetSummary _prev_period_summary;
44 protected:
45 G1CollectedHeap* _g1;
46 size_t _conc_refine_cards;
47 uint n_workers();
48
49 protected:
50 enum SomePrivateConstants {
51 UpdateRStoMergeSync = 0,
52 MergeRStoDoDirtySync = 1,
53 DoDirtySync = 2,
54 LastSync = 3,
77 G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
78 ~G1RemSet();
79
80 // Invoke "blk->do_oop" on all pointers into the collection set
81 // from objects in regions outside the collection set (having
82 // invoked "blk->set_region" to set the "from" region correctly
83 // beforehand.)
84 //
85 // Apply non_heap_roots on the oops of the unmarked nmethods
86 // on the strong code roots list for each region in the
87 // collection set.
88 //
89 // The "worker_i" param is for the parallel case where the id
90 // of the worker thread calling this function can be helpful in
91 // partitioning the work to be done. It should be the same as
92 // the "i" passed to the calling thread's work(i) function.
93 // In the sequential case this param will be ignored.
94 //
95 // Returns the number of cards scanned while looking for pointers
96 // into the collection set.
97 size_t oops_into_collection_set_do(G1ParPushHeapRSClosure* blk,
98 CodeBlobClosure* heap_region_codeblobs,
99 uint worker_i);
100
101 // Prepare for and cleanup after an oops_into_collection_set_do
102 // call. Must call each of these once before and after (in sequential
103 // code) any threads call oops_into_collection_set_do. (This offers an
104 // opportunity to sequential setup and teardown of structures needed by a
105 // parallel iteration over the CS's RS.)
106 void prepare_for_oops_into_collection_set_do();
107 void cleanup_after_oops_into_collection_set_do();
108
109 size_t scanRS(G1ParPushHeapRSClosure* oc,
110 CodeBlobClosure* heap_region_codeblobs,
111 uint worker_i);
112
113 void updateRS(DirtyCardQueue* into_cset_dcq, uint worker_i);
114
115 CardTableModRefBS* ct_bs() { return _ct_bs; }
116
117 // Record, if necessary, the fact that *p (where "p" is in region "from",
118 // which is required to be non-NULL) has changed to a new non-NULL value.
119 template <class T> void write_ref(HeapRegion* from, T* p);
120 template <class T> void par_write_ref(HeapRegion* from, T* p, uint tid);
121
122 // Requires "region_bm" and "card_bm" to be bitmaps with 1 bit per region
123 // or card, respectively, such that a region or card with a corresponding
124 // 0 bit contains no part of any live object. Eliminates any remembered
125 // set entries that correspond to dead heap ranges. "worker_num" is the
126 // parallel thread id of the current thread, and "hrclaimer" is the
127 // HeapRegionClaimer that should be used.
128 void scrub(BitMap* region_bm, BitMap* card_bm, uint worker_num, HeapRegionClaimer* hrclaimer);
129
130 // Refine the card corresponding to "card_ptr".
|
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/g1RemSetSummary.hpp"
29
30 // A G1RemSet provides ways of iterating over pointers into a selected
31 // collection set.
32
33 class ConcurrentG1Refine;
34 class G1CollectedHeap;
35 class G1EvacuationRootClosures;
36 class G1ParPushHeapRSClosure;
37
38 // A G1RemSet in which each heap region has a rem set that records the
39 // external heap references into it. Uses a mod ref bs to track updates,
40 // so that they can be used to update the individual region remsets.
41
42 class G1RemSet: public CHeapObj<mtGC> {
43 private:
44 G1RemSetSummary _prev_period_summary;
45 protected:
46 G1CollectedHeap* _g1;
47 size_t _conc_refine_cards;
48 uint n_workers();
49
50 protected:
51 enum SomePrivateConstants {
52 UpdateRStoMergeSync = 0,
53 MergeRStoDoDirtySync = 1,
54 DoDirtySync = 2,
55 LastSync = 3,
78 G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
79 ~G1RemSet();
80
81 // Invoke "blk->do_oop" on all pointers into the collection set
82 // from objects in regions outside the collection set (having
83 // invoked "blk->set_region" to set the "from" region correctly
84 // beforehand.)
85 //
86 // Apply non_heap_roots on the oops of the unmarked nmethods
87 // on the strong code roots list for each region in the
88 // collection set.
89 //
90 // The "worker_i" param is for the parallel case where the id
91 // of the worker thread calling this function can be helpful in
92 // partitioning the work to be done. It should be the same as
93 // the "i" passed to the calling thread's work(i) function.
94 // In the sequential case this param will be ignored.
95 //
96 // Returns the number of cards scanned while looking for pointers
97 // into the collection set.
98 size_t oops_into_collection_set_do(G1EvacuationRootClosures* closures,
99 uint worker_i);
100
101 // Prepare for and cleanup after an oops_into_collection_set_do
102 // call. Must call each of these once before and after (in sequential
103 // code) any threads call oops_into_collection_set_do. (This offers an
104 // opportunity to sequential setup and teardown of structures needed by a
105 // parallel iteration over the CS's RS.)
106 void prepare_for_oops_into_collection_set_do();
107 void cleanup_after_oops_into_collection_set_do();
108
109 size_t scanRS(G1EvacuationRootClosures* closures,
110 uint worker_i);
111
112 void updateRS(DirtyCardQueue* into_cset_dcq, uint worker_i);
113
114 CardTableModRefBS* ct_bs() { return _ct_bs; }
115
116 // Record, if necessary, the fact that *p (where "p" is in region "from",
117 // which is required to be non-NULL) has changed to a new non-NULL value.
118 template <class T> void write_ref(HeapRegion* from, T* p);
119 template <class T> void par_write_ref(HeapRegion* from, T* p, uint tid);
120
121 // Requires "region_bm" and "card_bm" to be bitmaps with 1 bit per region
122 // or card, respectively, such that a region or card with a corresponding
123 // 0 bit contains no part of any live object. Eliminates any remembered
124 // set entries that correspond to dead heap ranges. "worker_num" is the
125 // parallel thread id of the current thread, and "hrclaimer" is the
126 // HeapRegionClaimer that should be used.
127 void scrub(BitMap* region_bm, BitMap* card_bm, uint worker_num, HeapRegionClaimer* hrclaimer);
128
129 // Refine the card corresponding to "card_ptr".
|