55
56 class GCPolicyCounters;
57 class MarkSweepPolicy;
58
59 class CollectorPolicy : public CHeapObj<mtGC> {
60 protected:
61 virtual void initialize_alignments() = 0;
62 virtual void initialize_flags();
63 virtual void initialize_size_info();
64
65 DEBUG_ONLY(virtual void assert_flags();)
66 DEBUG_ONLY(virtual void assert_size_info();)
67
68 size_t _initial_heap_byte_size;
69 size_t _max_heap_byte_size;
70 size_t _min_heap_byte_size;
71
72 size_t _space_alignment;
73 size_t _heap_alignment;
74
75 // The sizing of the heap is controlled by a sizing policy.
76 AdaptiveSizePolicy* _size_policy;
77
78 // Set to true when policy wants soft refs cleared.
79 // Reset to false by gc after it clears all soft refs.
80 bool _should_clear_all_soft_refs;
81
82 // Set to true by the GC if the just-completed gc cleared all
83 // softrefs. This is set to true whenever a gc clears all softrefs, and
84 // set to false each time gc returns to the mutator. For example, in the
85 // ParallelScavengeHeap case the latter would be done toward the end of
86 // mem_allocate() where it returns op.result()
87 bool _all_soft_refs_clear;
88
89 CollectorPolicy();
90
91 public:
92 virtual void initialize_all() {
93 initialize_alignments();
94 initialize_flags();
95 initialize_size_info();
96 }
97
98 // Return maximum heap alignment that may be imposed by the policy.
99 static size_t compute_heap_alignment();
100
101 size_t space_alignment() { return _space_alignment; }
102 size_t heap_alignment() { return _heap_alignment; }
103
104 size_t initial_heap_byte_size() { return _initial_heap_byte_size; }
105 size_t max_heap_byte_size() { return _max_heap_byte_size; }
106 size_t min_heap_byte_size() { return _min_heap_byte_size; }
107
108 AdaptiveSizePolicy* size_policy() { return _size_policy; }
109 bool should_clear_all_soft_refs() { return _should_clear_all_soft_refs; }
110 void set_should_clear_all_soft_refs(bool v) { _should_clear_all_soft_refs = v; }
111 // Returns the current value of _should_clear_all_soft_refs.
112 // _should_clear_all_soft_refs is set to false as a side effect.
113 bool use_should_clear_all_soft_refs(bool v);
114 bool all_soft_refs_clear() { return _all_soft_refs_clear; }
115 void set_all_soft_refs_clear(bool v) { _all_soft_refs_clear = v; }
116
117 // Called by the GC after Soft Refs have been cleared to indicate
118 // that the request in _should_clear_all_soft_refs has been fulfilled.
119 void cleared_all_soft_refs();
120
121 // Identification methods.
122 virtual GenCollectorPolicy* as_generation_policy() { return NULL; }
123 virtual MarkSweepPolicy* as_mark_sweep_policy() { return NULL; }
124 #if INCLUDE_ALL_GCS
125 virtual ConcurrentMarkSweepPolicy* as_concurrent_mark_sweep_policy() { return NULL; }
126 #endif // INCLUDE_ALL_GCS
127 // Note that these are not virtual.
128 bool is_generation_policy() { return as_generation_policy() != NULL; }
129 bool is_mark_sweep_policy() { return as_mark_sweep_policy() != NULL; }
130 #if INCLUDE_ALL_GCS
131 bool is_concurrent_mark_sweep_policy() { return as_concurrent_mark_sweep_policy() != NULL; }
132 #else // INCLUDE_ALL_GCS
133 bool is_concurrent_mark_sweep_policy() { return false; }
134 #endif // INCLUDE_ALL_GCS
135
136
137 virtual CardTableRS* create_rem_set(MemRegion reserved);
138
139 MetaWord* satisfy_failed_metadata_allocation(ClassLoaderData* loader_data,
140 size_t size,
141 Metaspace::MetadataType mdtype);
142 };
143
144 class ClearedAllSoftRefs : public StackObj {
145 bool _clear_all_soft_refs;
146 CollectorPolicy* _collector_policy;
147 public:
148 ClearedAllSoftRefs(bool clear_all_soft_refs,
149 CollectorPolicy* collector_policy) :
150 _clear_all_soft_refs(clear_all_soft_refs),
151 _collector_policy(collector_policy) {}
152
153 ~ClearedAllSoftRefs() {
154 if (_clear_all_soft_refs) {
155 _collector_policy->cleared_all_soft_refs();
156 }
157 }
158 };
159
160 class GenCollectorPolicy : public CollectorPolicy {
161 friend class TestGenCollectorPolicy;
162 friend class VMStructs;
163 protected:
164 size_t _min_young_size;
165 size_t _initial_young_size;
166 size_t _max_young_size;
167 size_t _min_old_size;
168 size_t _initial_old_size;
169 size_t _max_old_size;
170
171 // _gen_alignment and _space_alignment will have the same value most of the
172 // time. When using large pages they can differ.
173 size_t _gen_alignment;
174
175 GenerationSpec* _young_gen_spec;
176 GenerationSpec* _old_gen_spec;
177
178 GCPolicyCounters* _gc_policy_counters;
179
180 // Return true if an allocation should be attempted in the older generation
181 // if it fails in the younger generation. Return false, otherwise.
182 virtual bool should_try_older_generation_allocation(size_t word_size) const;
183
184 void initialize_flags();
185 void initialize_size_info();
186
187 DEBUG_ONLY(void assert_flags();)
188 DEBUG_ONLY(void assert_size_info();)
189
190 // Try to allocate space by expanding the heap.
191 virtual HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab);
192
193 // Compute max heap alignment.
194 size_t compute_max_alignment();
195
196 // Scale the base_size by NewRatio according to
197 // result = base_size / (NewRatio + 1)
198 // and align by min_alignment()
199 size_t scale_by_NewRatio_aligned(size_t base_size);
213 size_t initial_old_size() { return _initial_old_size; }
214 size_t max_old_size() { return _max_old_size; }
215
216 GenerationSpec* young_gen_spec() const {
217 assert(_young_gen_spec != NULL, "_young_gen_spec should have been initialized");
218 return _young_gen_spec;
219 }
220
221 GenerationSpec* old_gen_spec() const {
222 assert(_old_gen_spec != NULL, "_old_gen_spec should have been initialized");
223 return _old_gen_spec;
224 }
225
226 // Performance Counter support
227 GCPolicyCounters* counters() { return _gc_policy_counters; }
228
229 // Create the jstat counters for the GC policy.
230 virtual void initialize_gc_policy_counters() = 0;
231
232 virtual GenCollectorPolicy* as_generation_policy() { return this; }
233
234 virtual void initialize_generations() { };
235
236 virtual void initialize_all() {
237 CollectorPolicy::initialize_all();
238 initialize_generations();
239 }
240
241 size_t young_gen_size_lower_bound();
242
243 size_t old_gen_size_lower_bound();
244
245 HeapWord* mem_allocate_work(size_t size,
246 bool is_tlab,
247 bool* gc_overhead_limit_was_exceeded);
248
249 HeapWord *satisfy_failed_allocation(size_t size, bool is_tlab);
250
251 // Adaptive size policy
252 virtual void initialize_size_policy(size_t init_eden_size,
253 size_t init_promo_size,
254 size_t init_survivor_size);
255 };
256
257 class MarkSweepPolicy : public GenCollectorPolicy {
258 protected:
259 void initialize_alignments();
260 void initialize_generations();
261
262 public:
263 MarkSweepPolicy() {}
264
265 MarkSweepPolicy* as_mark_sweep_policy() { return this; }
266
267 void initialize_gc_policy_counters();
268 };
269
270 #endif // SHARE_VM_GC_SHARED_COLLECTORPOLICY_HPP
|
55
56 class GCPolicyCounters;
57 class MarkSweepPolicy;
58
59 class CollectorPolicy : public CHeapObj<mtGC> {
60 protected:
61 virtual void initialize_alignments() = 0;
62 virtual void initialize_flags();
63 virtual void initialize_size_info();
64
65 DEBUG_ONLY(virtual void assert_flags();)
66 DEBUG_ONLY(virtual void assert_size_info();)
67
68 size_t _initial_heap_byte_size;
69 size_t _max_heap_byte_size;
70 size_t _min_heap_byte_size;
71
72 size_t _space_alignment;
73 size_t _heap_alignment;
74
75 CollectorPolicy();
76
77 public:
78 virtual void initialize_all() {
79 initialize_alignments();
80 initialize_flags();
81 initialize_size_info();
82 }
83
84 // Return maximum heap alignment that may be imposed by the policy.
85 static size_t compute_heap_alignment();
86
87 size_t space_alignment() { return _space_alignment; }
88 size_t heap_alignment() { return _heap_alignment; }
89
90 size_t initial_heap_byte_size() { return _initial_heap_byte_size; }
91 size_t max_heap_byte_size() { return _max_heap_byte_size; }
92 size_t min_heap_byte_size() { return _min_heap_byte_size; }
93
94 // Identification methods.
95 virtual GenCollectorPolicy* as_generation_policy() {
96 ShouldNotReachHere();
97 return NULL;
98 }
99 virtual MarkSweepPolicy* as_mark_sweep_policy() {
100 ShouldNotReachHere();
101 return NULL;
102 }
103 #if INCLUDE_ALL_GCS
104 virtual ConcurrentMarkSweepPolicy* as_concurrent_mark_sweep_policy() {
105 ShouldNotReachHere();
106 return NULL;
107 }
108 #endif // INCLUDE_ALL_GCS
109 // Note that these are not virtual.
110 virtual bool is_generation_policy() { return false; }
111 virtual bool is_mark_sweep_policy() { return false; }
112 #if INCLUDE_ALL_GCS
113 virtual bool is_concurrent_mark_sweep_policy() { return false; }
114 #endif // INCLUDE_ALL_GCS
115
116
117 virtual CardTableRS* create_rem_set(MemRegion reserved);
118
119 MetaWord* satisfy_failed_metadata_allocation(ClassLoaderData* loader_data,
120 size_t size,
121 Metaspace::MetadataType mdtype);
122 };
123
124 class GenCollectorPolicy : public CollectorPolicy {
125 friend class TestGenCollectorPolicy;
126 friend class VMStructs;
127 protected:
128
129 size_t _min_young_size;
130 size_t _initial_young_size;
131 size_t _max_young_size;
132 size_t _min_old_size;
133 size_t _initial_old_size;
134 size_t _max_old_size;
135
136 // _gen_alignment and _space_alignment will have the same value most of the
137 // time. When using large pages they can differ.
138 size_t _gen_alignment;
139
140 GenerationSpec* _young_gen_spec;
141 GenerationSpec* _old_gen_spec;
142
143 GCPolicyCounters* _gc_policy_counters;
144
145 // The sizing of the heap is controlled by a sizing policy.
146 AdaptiveSizePolicy* _size_policy;
147
148 // Set to true when policy wants soft refs cleared.
149 // Reset to false by gc after it clears all soft refs.
150 bool _should_clear_all_soft_refs;
151
152 // Set to true by the GC if the just-completed gc cleared all
153 // softrefs. This is set to true whenever a gc clears all softrefs, and
154 // set to false each time gc returns to the mutator. For example, in the
155 // ParallelScavengeHeap case the latter would be done toward the end of
156 // mem_allocate() where it returns op.result()
157 bool _all_soft_refs_clear;
158
159 // Return true if an allocation should be attempted in the older generation
160 // if it fails in the younger generation. Return false, otherwise.
161 virtual bool should_try_older_generation_allocation(size_t word_size) const;
162
163 void initialize_flags();
164 void initialize_size_info();
165
166 DEBUG_ONLY(void assert_flags();)
167 DEBUG_ONLY(void assert_size_info();)
168
169 // Try to allocate space by expanding the heap.
170 virtual HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab);
171
172 // Compute max heap alignment.
173 size_t compute_max_alignment();
174
175 // Scale the base_size by NewRatio according to
176 // result = base_size / (NewRatio + 1)
177 // and align by min_alignment()
178 size_t scale_by_NewRatio_aligned(size_t base_size);
192 size_t initial_old_size() { return _initial_old_size; }
193 size_t max_old_size() { return _max_old_size; }
194
195 GenerationSpec* young_gen_spec() const {
196 assert(_young_gen_spec != NULL, "_young_gen_spec should have been initialized");
197 return _young_gen_spec;
198 }
199
200 GenerationSpec* old_gen_spec() const {
201 assert(_old_gen_spec != NULL, "_old_gen_spec should have been initialized");
202 return _old_gen_spec;
203 }
204
205 // Performance Counter support
206 GCPolicyCounters* counters() { return _gc_policy_counters; }
207
208 // Create the jstat counters for the GC policy.
209 virtual void initialize_gc_policy_counters() = 0;
210
211 virtual GenCollectorPolicy* as_generation_policy() { return this; }
212 virtual bool is_generation_policy() { return true; }
213
214 virtual void initialize_generations() { };
215
216 virtual void initialize_all() {
217 CollectorPolicy::initialize_all();
218 initialize_generations();
219 }
220
221 size_t young_gen_size_lower_bound();
222
223 size_t old_gen_size_lower_bound();
224
225 HeapWord* mem_allocate_work(size_t size,
226 bool is_tlab,
227 bool* gc_overhead_limit_was_exceeded);
228
229 HeapWord *satisfy_failed_allocation(size_t size, bool is_tlab);
230
231 // Adaptive size policy
232 AdaptiveSizePolicy* size_policy() { return _size_policy; }
233
234 virtual void initialize_size_policy(size_t init_eden_size,
235 size_t init_promo_size,
236 size_t init_survivor_size);
237
238 void cleared_all_soft_refs();
239
240 bool should_clear_all_soft_refs() { return _should_clear_all_soft_refs; }
241 void set_should_clear_all_soft_refs(bool v) { _should_clear_all_soft_refs = v; }
242 // Returns the current value of _should_clear_all_soft_refs.
243 // _should_clear_all_soft_refs is set to false as a side effect.
244 bool use_should_clear_all_soft_refs(bool v);
245
246 bool all_soft_refs_clear() { return _all_soft_refs_clear; }
247 void set_all_soft_refs_clear(bool v) { _all_soft_refs_clear = v; }
248 };
249
250 class ClearedAllSoftRefs : public StackObj {
251 bool _clear_all_soft_refs;
252 GenCollectorPolicy* _collector_policy;
253 public:
254 ClearedAllSoftRefs(bool clear_all_soft_refs,
255 GenCollectorPolicy* collector_policy) :
256 _clear_all_soft_refs(clear_all_soft_refs),
257 _collector_policy(collector_policy) {}
258
259 ~ClearedAllSoftRefs() {
260 if (_clear_all_soft_refs) {
261 _collector_policy->cleared_all_soft_refs();
262 }
263 }
264 };
265
266 class MarkSweepPolicy : public GenCollectorPolicy {
267 protected:
268 void initialize_alignments();
269 void initialize_generations();
270
271 public:
272 MarkSweepPolicy() {}
273
274 MarkSweepPolicy* as_mark_sweep_policy() { return this; }
275 virtual bool is_mark_sweep_policy() { return true; }
276
277 void initialize_gc_policy_counters();
278 };
279
280 #endif // SHARE_VM_GC_SHARED_COLLECTORPOLICY_HPP
|