30 #include "utilities/debug.hpp"
31 #include "utilities/globalDefinitions.hpp"
32
33 class G1CollectedHeap;
34 class G1CollectorState;
35 class G1GCPhaseTimes;
36 class G1Policy;
37 class G1SurvivorRegions;
38 class HeapRegion;
39
40 class G1CollectionSet VALUE_OBJ_CLASS_SPEC {
41 G1CollectedHeap* _g1;
42 G1Policy* _policy;
43
44 CollectionSetChooser* _cset_chooser;
45
46 uint _eden_region_length;
47 uint _survivor_region_length;
48 uint _old_region_length;
49
50 // The head of the list (via "next_in_collection_set()") representing the
51 // current collection set. Set from the incrementally built collection
52 // set at the start of the pause.
53 HeapRegion* _head;
54
55 // The number of bytes in the collection set before the pause. Set from
56 // the incrementally built collection set at the start of an evacuation
57 // pause, and incremented in finalize_old_part() when adding old regions
58 // (if any) to the collection set.
59 size_t _bytes_used_before;
60
61 size_t _recorded_rs_lengths;
62
63 // The associated information that is maintained while the incremental
64 // collection set is being built with young regions. Used to populate
65 // the recorded info for the evacuation pause.
66
67 enum CSetBuildType {
68 Active, // We are actively building the collection set
69 Inactive // We are not actively building the collection set
70 };
71
72 CSetBuildType _inc_build_state;
73
74 // The head of the incrementally built collection set.
75 HeapRegion* _inc_head;
76
77 // The tail of the incrementally built collection set.
78 HeapRegion* _inc_tail;
79
80 // The number of bytes in the incrementally built collection set.
81 // Used to set _collection_set_bytes_used_before at the start of
82 // an evacuation pause.
83 size_t _inc_bytes_used_before;
84
85 // The RSet lengths recorded for regions in the CSet. It is updated
86 // by the thread that adds a new region to the CSet. We assume that
87 // only one thread can be allocating a new CSet region (currently,
88 // it does so after taking the Heap_lock) hence no need to
89 // synchronize updates to this field.
90 size_t _inc_recorded_rs_lengths;
91
92 // A concurrent refinement thread periodically samples the young
93 // region RSets and needs to update _inc_recorded_rs_lengths as
94 // the RSets grow. Instead of having to synchronize updates to that
95 // field we accumulate them in this field and add it to
96 // _inc_recorded_rs_lengths_diffs at the start of a GC.
97 ssize_t _inc_recorded_rs_lengths_diffs;
98
99 // The predicted elapsed time it will take to collect the regions in
100 // the CSet. This is updated by the thread that adds a new region to
101 // the CSet. See the comment for _inc_recorded_rs_lengths about
102 // MT-safety assumptions.
103 double _inc_predicted_elapsed_time_ms;
104
105 // See the comment for _inc_recorded_rs_lengths_diffs.
106 double _inc_predicted_elapsed_time_ms_diffs;
107
108 uint _inc_region_length;
109
110 G1CollectorState* collector_state();
111 G1GCPhaseTimes* phase_times();
112
113 double predict_region_elapsed_time_ms(HeapRegion* hr);
114
115 void verify_young_cset_indices() const NOT_DEBUG_RETURN;
116 public:
117 G1CollectionSet(G1CollectedHeap* g1h, G1Policy* policy);
118 ~G1CollectionSet();
119
120 CollectionSetChooser* cset_chooser();
121
122 void init_region_lengths(uint eden_cset_region_length,
123 uint survivor_cset_region_length);
124
125 void set_recorded_rs_lengths(size_t rs_lengths);
126
127 uint region_length() const { return young_region_length() +
128 old_region_length(); }
129 uint young_region_length() const { return eden_region_length() +
130 survivor_region_length(); }
131
132 uint eden_region_length() const { return _eden_region_length; }
133 uint survivor_region_length() const { return _survivor_region_length; }
134 uint old_region_length() const { return _old_region_length; }
135
136 // Incremental CSet Support
137
138 // The head of the incrementally built collection set.
139 HeapRegion* inc_head() { return _inc_head; }
140
141 // The tail of the incrementally built collection set.
142 HeapRegion* inc_tail() { return _inc_tail; }
143
144 // Initialize incremental collection set info.
145 void start_incremental_building();
146
147 // Perform any final calculations on the incremental CSet fields
148 // before we can use them.
149 void finalize_incremental_building();
150
151 void clear_incremental() {
152 _inc_head = NULL;
153 _inc_tail = NULL;
154 _inc_region_length = 0;
155 }
156
157 // Stop adding regions to the incremental collection set
158 void stop_incremental_building() { _inc_build_state = Inactive; }
159
160 // The head of the list (via "next_in_collection_set()") representing the
161 // current collection set.
162 HeapRegion* head() { return _head; }
163
164 void clear_head() { _head = NULL; }
165
166 size_t recorded_rs_lengths() { return _recorded_rs_lengths; }
167
168 size_t bytes_used_before() const {
169 return _bytes_used_before;
170 }
171
172 void reset_bytes_used_before() {
173 _bytes_used_before = 0;
174 }
175
176 // Choose a new collection set. Marks the chosen regions as being
177 // "in_collection_set", and links them together. The head and number of
178 // the collection set are available via access methods.
179 double finalize_young_part(double target_pause_time_ms, G1SurvivorRegions* survivors);
180 void finalize_old_part(double time_remaining_ms);
181
182 // Add old region "hr" to the CSet.
183 void add_old_region(HeapRegion* hr);
184
185 // Update information about hr in the aggregated information for
186 // the incrementally built collection set.
187 void update_young_region_prediction(HeapRegion* hr, size_t new_rs_length);
188
189 // Add hr to the LHS of the incremental collection set.
190 void add_eden_region(HeapRegion* hr);
191
192 // Add hr to the RHS of the incremental collection set.
193 void add_survivor_regions(HeapRegion* hr);
194
195 #ifndef PRODUCT
196 void print(HeapRegion* list_head, outputStream* st);
197 #endif // !PRODUCT
198
199 private:
200 // Update the incremental cset information when adding a region
201 // (should not be called directly).
202 void add_young_region_common(HeapRegion* hr);
203
204 };
205
206 #endif // SHARE_VM_GC_G1_G1COLLECTIONSET_HPP
207
|
30 #include "utilities/debug.hpp"
31 #include "utilities/globalDefinitions.hpp"
32
33 class G1CollectedHeap;
34 class G1CollectorState;
35 class G1GCPhaseTimes;
36 class G1Policy;
37 class G1SurvivorRegions;
38 class HeapRegion;
39
40 class G1CollectionSet VALUE_OBJ_CLASS_SPEC {
41 G1CollectedHeap* _g1;
42 G1Policy* _policy;
43
44 CollectionSetChooser* _cset_chooser;
45
46 uint _eden_region_length;
47 uint _survivor_region_length;
48 uint _old_region_length;
49
50 // The actual collection set as a set of region indices.
51 uint* _collection_set_regions;
52 volatile size_t _collection_set_cur_length;
53 size_t _collection_set_max_length;
54
55 // The number of bytes in the collection set before the pause. Set from
56 // the incrementally built collection set at the start of an evacuation
57 // pause, and incremented in finalize_old_part() when adding old regions
58 // (if any) to the collection set.
59 size_t _bytes_used_before;
60
61 size_t _recorded_rs_lengths;
62
63 // The associated information that is maintained while the incremental
64 // collection set is being built with young regions. Used to populate
65 // the recorded info for the evacuation pause.
66
67 enum CSetBuildType {
68 Active, // We are actively building the collection set
69 Inactive // We are not actively building the collection set
70 };
71
72 CSetBuildType _inc_build_state;
73
74 // The number of bytes in the incrementally built collection set.
75 // Used to set _collection_set_bytes_used_before at the start of
76 // an evacuation pause.
77 size_t _inc_bytes_used_before;
78
79 // The RSet lengths recorded for regions in the CSet. It is updated
80 // by the thread that adds a new region to the CSet. We assume that
81 // only one thread can be allocating a new CSet region (currently,
82 // it does so after taking the Heap_lock) hence no need to
83 // synchronize updates to this field.
84 size_t _inc_recorded_rs_lengths;
85
86 // A concurrent refinement thread periodically samples the young
87 // region RSets and needs to update _inc_recorded_rs_lengths as
88 // the RSets grow. Instead of having to synchronize updates to that
89 // field we accumulate them in this field and add it to
90 // _inc_recorded_rs_lengths_diffs at the start of a GC.
91 ssize_t _inc_recorded_rs_lengths_diffs;
92
93 // The predicted elapsed time it will take to collect the regions in
94 // the CSet. This is updated by the thread that adds a new region to
95 // the CSet. See the comment for _inc_recorded_rs_lengths about
96 // MT-safety assumptions.
97 double _inc_predicted_elapsed_time_ms;
98
99 // See the comment for _inc_recorded_rs_lengths_diffs.
100 double _inc_predicted_elapsed_time_ms_diffs;
101
102 G1CollectorState* collector_state();
103 G1GCPhaseTimes* phase_times();
104
105 double predict_region_elapsed_time_ms(HeapRegion* hr);
106
107 void verify_young_cset_indices() const NOT_DEBUG_RETURN;
108 public:
109 G1CollectionSet(G1CollectedHeap* g1h, G1Policy* policy);
110 ~G1CollectionSet();
111
112 // Set the maximum possible length of the collection set.
113 void set_max_length(uint max_region_length);
114
115 CollectionSetChooser* cset_chooser();
116
117 void init_region_lengths(uint eden_cset_region_length,
118 uint survivor_cset_region_length);
119
120 void set_recorded_rs_lengths(size_t rs_lengths);
121
122 uint region_length() const { return young_region_length() +
123 old_region_length(); }
124 uint young_region_length() const { return eden_region_length() +
125 survivor_region_length(); }
126
127 uint eden_region_length() const { return _eden_region_length; }
128 uint survivor_region_length() const { return _survivor_region_length; }
129 uint old_region_length() const { return _old_region_length; }
130
131 // Incremental collection set support
132
133 // Initialize incremental collection set info.
134 void start_incremental_building();
135
136 // Perform any final calculations on the incremental collection set fields
137 // before we can use them.
138 void finalize_incremental_building();
139
140 // Reset the contents of the collection set.
141 void clear();
142
143 // Iterate over the collection set, applying the given HeapRegionClosure on all of them.
144 // If may_be_aborted is true, iteration may be aborted using the return value of the
145 // called closure method.
146 void iterate(HeapRegionClosure* cl, bool may_be_aborted = false);
147
148 // Iterate over the collection set, applying the given HeapRegionClosure on all of them,
149 // trying to optimally spread out starting position of total_workers workers given the
150 // caller's worker_id.
151 // If may_be_aborted is true, iteration may be aborted using the return value of the
152 // called closure method.
153 void iterate_from(HeapRegionClosure* cl, uint worker_id, uint total_workers, bool may_be_aborted = false);
154
155 // Stop adding regions to the incremental collection set.
156 void stop_incremental_building() { _inc_build_state = Inactive; }
157
158 size_t recorded_rs_lengths() { return _recorded_rs_lengths; }
159
160 size_t bytes_used_before() const {
161 return _bytes_used_before;
162 }
163
164 void reset_bytes_used_before() {
165 _bytes_used_before = 0;
166 }
167
168 // Choose a new collection set. Marks the chosen regions as being
169 // "in_collection_set".
170 double finalize_young_part(double target_pause_time_ms, G1SurvivorRegions* survivors);
171 void finalize_old_part(double time_remaining_ms);
172
173 // Add old region "hr" to the collection set.
174 void add_old_region(HeapRegion* hr);
175
176 // Update information about hr in the aggregated information for
177 // the incrementally built collection set.
178 void update_young_region_prediction(HeapRegion* hr, size_t new_rs_length);
179
180 // Add eden region to the collection set.
181 void add_eden_region(HeapRegion* hr);
182
183 // Add survivor region to the collection set.
184 void add_survivor_regions(HeapRegion* hr);
185
186 #ifndef PRODUCT
187 bool verify_young_ages();
188
189 void print(outputStream* st);
190 #endif // !PRODUCT
191
192 private:
193 // Update the incremental collection set information when adding a region.
194 void add_young_region_common(HeapRegion* hr);
195 };
196
197 #endif // SHARE_VM_GC_G1_G1COLLECTIONSET_HPP
198
|