Mercurial > hg > graal-compiler
comparison src/share/vm/memory/collectorPolicy.hpp @ 13102:f9f4503a4ab5
Merge
author | Christos Kotselidis <christos.kotselidis@oracle.com> |
---|---|
date | Thu, 21 Nov 2013 15:04:54 +0100 |
parents | 236cecd9ec97 |
children | 63a4eb8bcd23 1d01a7f3a336 |
comparison
equal
deleted
inserted
replaced
13101:790ebab62d23 | 13102:f9f4503a4ab5 |
---|---|
59 | 59 |
60 class CollectorPolicy : public CHeapObj<mtGC> { | 60 class CollectorPolicy : public CHeapObj<mtGC> { |
61 protected: | 61 protected: |
62 GCPolicyCounters* _gc_policy_counters; | 62 GCPolicyCounters* _gc_policy_counters; |
63 | 63 |
64 // Requires that the concrete subclass sets the alignment constraints | 64 virtual void initialize_alignments() = 0; |
65 // before calling. | |
66 virtual void initialize_flags(); | 65 virtual void initialize_flags(); |
67 virtual void initialize_size_info(); | 66 virtual void initialize_size_info(); |
67 | |
68 DEBUG_ONLY(virtual void assert_flags();) | |
69 DEBUG_ONLY(virtual void assert_size_info();) | |
68 | 70 |
69 size_t _initial_heap_byte_size; | 71 size_t _initial_heap_byte_size; |
70 size_t _max_heap_byte_size; | 72 size_t _max_heap_byte_size; |
71 size_t _min_heap_byte_size; | 73 size_t _min_heap_byte_size; |
72 | 74 |
73 size_t _min_alignment; | 75 size_t _space_alignment; |
74 size_t _max_alignment; | 76 size_t _heap_alignment; |
77 | |
78 // Needed to keep information if MaxHeapSize was set on the command line | |
79 // when the flag value is aligned etc by ergonomics | |
80 bool _max_heap_size_cmdline; | |
75 | 81 |
76 // The sizing of the heap are controlled by a sizing policy. | 82 // The sizing of the heap are controlled by a sizing policy. |
77 AdaptiveSizePolicy* _size_policy; | 83 AdaptiveSizePolicy* _size_policy; |
78 | 84 |
79 // Set to true when policy wants soft refs cleared. | 85 // Set to true when policy wants soft refs cleared. |
80 // Reset to false by gc after it clears all soft refs. | 86 // Reset to false by gc after it clears all soft refs. |
81 bool _should_clear_all_soft_refs; | 87 bool _should_clear_all_soft_refs; |
88 | |
82 // Set to true by the GC if the just-completed gc cleared all | 89 // 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 | 90 // 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 | 91 // 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 | 92 // ParallelScavengeHeap case the latter would be done toward the end of |
86 // mem_allocate() where it returns op.result() | 93 // mem_allocate() where it returns op.result() |
87 bool _all_soft_refs_clear; | 94 bool _all_soft_refs_clear; |
88 | 95 |
89 CollectorPolicy() : | 96 CollectorPolicy(); |
90 _min_alignment(1), | 97 |
91 _max_alignment(1), | 98 public: |
92 _initial_heap_byte_size(0), | 99 virtual void initialize_all() { |
93 _max_heap_byte_size(0), | 100 initialize_alignments(); |
94 _min_heap_byte_size(0), | 101 initialize_flags(); |
95 _size_policy(NULL), | 102 initialize_size_info(); |
96 _should_clear_all_soft_refs(false), | 103 } |
97 _all_soft_refs_clear(false) | 104 |
98 {} | |
99 | |
100 public: | |
101 // Return maximum heap alignment that may be imposed by the policy | 105 // Return maximum heap alignment that may be imposed by the policy |
102 static size_t compute_max_alignment(); | 106 static size_t compute_heap_alignment(); |
103 | 107 |
104 void set_min_alignment(size_t align) { _min_alignment = align; } | 108 size_t space_alignment() { return _space_alignment; } |
105 size_t min_alignment() { return _min_alignment; } | 109 size_t heap_alignment() { return _heap_alignment; } |
106 void set_max_alignment(size_t align) { _max_alignment = align; } | |
107 size_t max_alignment() { return _max_alignment; } | |
108 | 110 |
109 size_t initial_heap_byte_size() { return _initial_heap_byte_size; } | 111 size_t initial_heap_byte_size() { return _initial_heap_byte_size; } |
110 void set_initial_heap_byte_size(size_t v) { _initial_heap_byte_size = v; } | |
111 size_t max_heap_byte_size() { return _max_heap_byte_size; } | 112 size_t max_heap_byte_size() { return _max_heap_byte_size; } |
112 void set_max_heap_byte_size(size_t v) { _max_heap_byte_size = v; } | |
113 size_t min_heap_byte_size() { return _min_heap_byte_size; } | 113 size_t min_heap_byte_size() { return _min_heap_byte_size; } |
114 void set_min_heap_byte_size(size_t v) { _min_heap_byte_size = v; } | |
115 | 114 |
116 enum Name { | 115 enum Name { |
117 CollectorPolicyKind, | 116 CollectorPolicyKind, |
118 TwoGenerationCollectorPolicyKind, | 117 TwoGenerationCollectorPolicyKind, |
119 ConcurrentMarkSweepPolicyKind, | 118 ConcurrentMarkSweepPolicyKind, |
154 bool is_g1_policy() { return false; } | 153 bool is_g1_policy() { return false; } |
155 #endif // INCLUDE_ALL_GCS | 154 #endif // INCLUDE_ALL_GCS |
156 | 155 |
157 | 156 |
158 virtual BarrierSet::Name barrier_set_name() = 0; | 157 virtual BarrierSet::Name barrier_set_name() = 0; |
159 virtual GenRemSet::Name rem_set_name() = 0; | |
160 | 158 |
161 // Create the remembered set (to cover the given reserved region, | 159 // Create the remembered set (to cover the given reserved region, |
162 // allowing breaking up into at most "max_covered_regions"). | 160 // allowing breaking up into at most "max_covered_regions"). |
163 virtual GenRemSet* create_rem_set(MemRegion reserved, | 161 virtual GenRemSet* create_rem_set(MemRegion reserved, |
164 int max_covered_regions); | 162 int max_covered_regions); |
198 // Returns true if a collector has eden space with soft end. | 196 // Returns true if a collector has eden space with soft end. |
199 virtual bool has_soft_ended_eden() { | 197 virtual bool has_soft_ended_eden() { |
200 return false; | 198 return false; |
201 } | 199 } |
202 | 200 |
201 // Do any updates required to global flags that are due to heap initialization | |
202 // changes | |
203 virtual void post_heap_initialize() = 0; | |
203 }; | 204 }; |
204 | 205 |
205 class ClearedAllSoftRefs : public StackObj { | 206 class ClearedAllSoftRefs : public StackObj { |
206 bool _clear_all_soft_refs; | 207 bool _clear_all_soft_refs; |
207 CollectorPolicy* _collector_policy; | 208 CollectorPolicy* _collector_policy; |
222 protected: | 223 protected: |
223 size_t _min_gen0_size; | 224 size_t _min_gen0_size; |
224 size_t _initial_gen0_size; | 225 size_t _initial_gen0_size; |
225 size_t _max_gen0_size; | 226 size_t _max_gen0_size; |
226 | 227 |
228 // _gen_alignment and _space_alignment will have the same value most of the | |
229 // time. When using large pages they can differ. | |
230 size_t _gen_alignment; | |
231 | |
227 GenerationSpec **_generations; | 232 GenerationSpec **_generations; |
228 | 233 |
229 // Return true if an allocation should be attempted in the older | 234 // Return true if an allocation should be attempted in the older |
230 // generation if it fails in the younger generation. Return | 235 // generation if it fails in the younger generation. Return |
231 // false, otherwise. | 236 // false, otherwise. |
232 virtual bool should_try_older_generation_allocation(size_t word_size) const; | 237 virtual bool should_try_older_generation_allocation(size_t word_size) const; |
233 | 238 |
234 void initialize_flags(); | 239 void initialize_flags(); |
235 void initialize_size_info(); | 240 void initialize_size_info(); |
236 | 241 |
242 DEBUG_ONLY(void assert_flags();) | |
243 DEBUG_ONLY(void assert_size_info();) | |
244 | |
237 // Try to allocate space by expanding the heap. | 245 // Try to allocate space by expanding the heap. |
238 virtual HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab); | 246 virtual HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab); |
239 | 247 |
240 // Scale the base_size by NewRation according to | 248 // Compute max heap alignment |
249 size_t compute_max_alignment(); | |
250 | |
251 // Scale the base_size by NewRatio according to | |
241 // result = base_size / (NewRatio + 1) | 252 // result = base_size / (NewRatio + 1) |
242 // and align by min_alignment() | 253 // and align by min_alignment() |
243 size_t scale_by_NewRatio_aligned(size_t base_size); | 254 size_t scale_by_NewRatio_aligned(size_t base_size); |
244 | 255 |
245 // Bound the value by the given maximum minus the | 256 // Bound the value by the given maximum minus the min_alignment |
246 // min_alignment. | |
247 size_t bound_minus_alignment(size_t desired_size, size_t maximum_size); | 257 size_t bound_minus_alignment(size_t desired_size, size_t maximum_size); |
248 | 258 |
249 public: | 259 public: |
260 GenCollectorPolicy(); | |
261 | |
250 // Accessors | 262 // Accessors |
251 size_t min_gen0_size() { return _min_gen0_size; } | 263 size_t min_gen0_size() { return _min_gen0_size; } |
252 void set_min_gen0_size(size_t v) { _min_gen0_size = v; } | |
253 size_t initial_gen0_size() { return _initial_gen0_size; } | 264 size_t initial_gen0_size() { return _initial_gen0_size; } |
254 void set_initial_gen0_size(size_t v) { _initial_gen0_size = v; } | 265 size_t max_gen0_size() { return _max_gen0_size; } |
255 size_t max_gen0_size() { return _max_gen0_size; } | 266 size_t gen_alignment() { return _gen_alignment; } |
256 void set_max_gen0_size(size_t v) { _max_gen0_size = v; } | |
257 | 267 |
258 virtual int number_of_generations() = 0; | 268 virtual int number_of_generations() = 0; |
259 | 269 |
260 virtual GenerationSpec **generations() { | 270 virtual GenerationSpec **generations() { |
261 assert(_generations != NULL, "Sanity check"); | 271 assert(_generations != NULL, "Sanity check"); |
262 return _generations; | 272 return _generations; |
263 } | 273 } |
264 | 274 |
265 virtual GenCollectorPolicy* as_generation_policy() { return this; } | 275 virtual GenCollectorPolicy* as_generation_policy() { return this; } |
266 | 276 |
267 virtual void initialize_generations() = 0; | 277 virtual void initialize_generations() { }; |
268 | 278 |
269 virtual void initialize_all() { | 279 virtual void initialize_all() { |
270 initialize_flags(); | 280 CollectorPolicy::initialize_all(); |
271 initialize_size_info(); | |
272 initialize_generations(); | 281 initialize_generations(); |
273 } | 282 } |
283 | |
284 size_t young_gen_size_lower_bound(); | |
274 | 285 |
275 HeapWord* mem_allocate_work(size_t size, | 286 HeapWord* mem_allocate_work(size_t size, |
276 bool is_tlab, | 287 bool is_tlab, |
277 bool* gc_overhead_limit_was_exceeded); | 288 bool* gc_overhead_limit_was_exceeded); |
278 | 289 |
280 | 291 |
281 // Adaptive size policy | 292 // Adaptive size policy |
282 virtual void initialize_size_policy(size_t init_eden_size, | 293 virtual void initialize_size_policy(size_t init_eden_size, |
283 size_t init_promo_size, | 294 size_t init_promo_size, |
284 size_t init_survivor_size); | 295 size_t init_survivor_size); |
296 | |
297 virtual void post_heap_initialize() { | |
298 assert(_max_gen0_size == MaxNewSize, "Should be taken care of by initialize_size_info"); | |
299 } | |
285 }; | 300 }; |
286 | 301 |
287 // All of hotspot's current collectors are subtypes of this | 302 // All of hotspot's current collectors are subtypes of this |
288 // class. Currently, these collectors all use the same gen[0], | 303 // class. Currently, these collectors all use the same gen[0], |
289 // but have different gen[1] types. If we add another subtype | 304 // but have different gen[1] types. If we add another subtype |
296 size_t _initial_gen1_size; | 311 size_t _initial_gen1_size; |
297 size_t _max_gen1_size; | 312 size_t _max_gen1_size; |
298 | 313 |
299 void initialize_flags(); | 314 void initialize_flags(); |
300 void initialize_size_info(); | 315 void initialize_size_info(); |
301 void initialize_generations() { ShouldNotReachHere(); } | 316 |
302 | 317 DEBUG_ONLY(void assert_flags();) |
303 public: | 318 DEBUG_ONLY(void assert_size_info();) |
319 | |
320 public: | |
321 TwoGenerationCollectorPolicy() : GenCollectorPolicy(), _min_gen1_size(0), | |
322 _initial_gen1_size(0), _max_gen1_size(0) {} | |
323 | |
304 // Accessors | 324 // Accessors |
305 size_t min_gen1_size() { return _min_gen1_size; } | 325 size_t min_gen1_size() { return _min_gen1_size; } |
306 void set_min_gen1_size(size_t v) { _min_gen1_size = v; } | |
307 size_t initial_gen1_size() { return _initial_gen1_size; } | 326 size_t initial_gen1_size() { return _initial_gen1_size; } |
308 void set_initial_gen1_size(size_t v) { _initial_gen1_size = v; } | 327 size_t max_gen1_size() { return _max_gen1_size; } |
309 size_t max_gen1_size() { return _max_gen1_size; } | |
310 void set_max_gen1_size(size_t v) { _max_gen1_size = v; } | |
311 | 328 |
312 // Inherited methods | 329 // Inherited methods |
313 TwoGenerationCollectorPolicy* as_two_generation_policy() { return this; } | 330 TwoGenerationCollectorPolicy* as_two_generation_policy() { return this; } |
314 | 331 |
315 int number_of_generations() { return 2; } | 332 int number_of_generations() { return 2; } |
316 BarrierSet::Name barrier_set_name() { return BarrierSet::CardTableModRef; } | 333 BarrierSet::Name barrier_set_name() { return BarrierSet::CardTableModRef; } |
317 GenRemSet::Name rem_set_name() { return GenRemSet::CardTable; } | |
318 | 334 |
319 virtual CollectorPolicy::Name kind() { | 335 virtual CollectorPolicy::Name kind() { |
320 return CollectorPolicy::TwoGenerationCollectorPolicyKind; | 336 return CollectorPolicy::TwoGenerationCollectorPolicyKind; |
321 } | 337 } |
322 | 338 |
323 // Returns true is gen0 sizes were adjusted | 339 // Returns true if gen0 sizes were adjusted |
324 bool adjust_gen0_sizes(size_t* gen0_size_ptr, size_t* gen1_size_ptr, | 340 bool adjust_gen0_sizes(size_t* gen0_size_ptr, size_t* gen1_size_ptr, |
325 const size_t heap_size, const size_t min_gen1_size); | 341 const size_t heap_size); |
326 }; | 342 }; |
327 | 343 |
328 class MarkSweepPolicy : public TwoGenerationCollectorPolicy { | 344 class MarkSweepPolicy : public TwoGenerationCollectorPolicy { |
329 protected: | 345 protected: |
346 void initialize_alignments(); | |
330 void initialize_generations(); | 347 void initialize_generations(); |
331 | 348 |
332 public: | 349 public: |
333 MarkSweepPolicy(); | 350 MarkSweepPolicy() {} |
334 | 351 |
335 MarkSweepPolicy* as_mark_sweep_policy() { return this; } | 352 MarkSweepPolicy* as_mark_sweep_policy() { return this; } |
336 | 353 |
337 void initialize_gc_policy_counters(); | 354 void initialize_gc_policy_counters(); |
338 }; | 355 }; |