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 };