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,
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);
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 // Set to true when policy wants soft refs cleared.
76 // Reset to false by gc after it clears all soft refs.
77 bool _should_clear_all_soft_refs;
78
79 // Set to true by the GC if the just-completed gc cleared all
80 // softrefs. This is set to true whenever a gc clears all softrefs, and
81 // set to false each time gc returns to the mutator. For example, in the
82 // ParallelScavengeHeap case the latter would be done toward the end of
83 // mem_allocate() where it returns op.result()
84 bool _all_soft_refs_clear;
85
86 CollectorPolicy();
87
88 public:
89 virtual void initialize_all() {
90 initialize_alignments();
91 initialize_flags();
92 initialize_size_info();
93 }
94
95 // Return maximum heap alignment that may be imposed by the policy.
96 static size_t compute_heap_alignment();
97
98 size_t space_alignment() { return _space_alignment; }
99 size_t heap_alignment() { return _heap_alignment; }
100
101 size_t initial_heap_byte_size() { return _initial_heap_byte_size; }
102 size_t max_heap_byte_size() { return _max_heap_byte_size; }
103 size_t min_heap_byte_size() { return _min_heap_byte_size; }
104
105 bool should_clear_all_soft_refs() { return _should_clear_all_soft_refs; }
106 void set_should_clear_all_soft_refs(bool v) { _should_clear_all_soft_refs = v; }
107 // Returns the current value of _should_clear_all_soft_refs.
108 // _should_clear_all_soft_refs is set to false as a side effect.
109 bool use_should_clear_all_soft_refs(bool v);
110 bool all_soft_refs_clear() { return _all_soft_refs_clear; }
111 void set_all_soft_refs_clear(bool v) { _all_soft_refs_clear = v; }
112
113 // Called by the GC after Soft Refs have been cleared to indicate
114 // that the request in _should_clear_all_soft_refs has been fulfilled.
115 virtual void cleared_all_soft_refs();
116
117 // Identification methods.
118 virtual GenCollectorPolicy* as_generation_policy() { return NULL; }
119 virtual MarkSweepPolicy* as_mark_sweep_policy() { return NULL; }
120 #if INCLUDE_ALL_GCS
121 virtual ConcurrentMarkSweepPolicy* as_concurrent_mark_sweep_policy() { return NULL; }
122 #endif // INCLUDE_ALL_GCS
123 // Note that these are not virtual.
124 bool is_generation_policy() { return as_generation_policy() != NULL; }
125 bool is_mark_sweep_policy() { return as_mark_sweep_policy() != NULL; }
126 #if INCLUDE_ALL_GCS
127 bool is_concurrent_mark_sweep_policy() { return as_concurrent_mark_sweep_policy() != NULL; }
128 #else // INCLUDE_ALL_GCS
129 bool is_concurrent_mark_sweep_policy() { return false; }
130 #endif // INCLUDE_ALL_GCS
131
132
133 virtual CardTableRS* create_rem_set(MemRegion reserved);
134
135 MetaWord* satisfy_failed_metadata_allocation(ClassLoaderData* loader_data,
139
140 class ClearedAllSoftRefs : public StackObj {
141 bool _clear_all_soft_refs;
142 CollectorPolicy* _collector_policy;
143 public:
144 ClearedAllSoftRefs(bool clear_all_soft_refs,
145 CollectorPolicy* collector_policy) :
146 _clear_all_soft_refs(clear_all_soft_refs),
147 _collector_policy(collector_policy) {}
148
149 ~ClearedAllSoftRefs() {
150 if (_clear_all_soft_refs) {
151 _collector_policy->cleared_all_soft_refs();
152 }
153 }
154 };
155
156 class GenCollectorPolicy : public CollectorPolicy {
157 friend class TestGenCollectorPolicy;
158 friend class VMStructs;
159
160 protected:
161 size_t _min_young_size;
162 size_t _initial_young_size;
163 size_t _max_young_size;
164 size_t _min_old_size;
165 size_t _initial_old_size;
166 size_t _max_old_size;
167
168 // _gen_alignment and _space_alignment will have the same value most of the
169 // time. When using large pages they can differ.
170 size_t _gen_alignment;
171
172 GenerationSpec* _young_gen_spec;
173 GenerationSpec* _old_gen_spec;
174
175 GCPolicyCounters* _gc_policy_counters;
176
177 // The sizing of the heap is controlled by a sizing policy.
178 AdaptiveSizePolicy* _size_policy;
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);
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 AdaptiveSizePolicy* size_policy() { return _size_policy; }
253
254 virtual void initialize_size_policy(size_t init_eden_size,
255 size_t init_promo_size,
256 size_t init_survivor_size);
257
258 void cleared_all_soft_refs();
259
260 };
261
262 class MarkSweepPolicy : public GenCollectorPolicy {
263 protected:
264 void initialize_alignments();
265 void initialize_generations();
266
267 public:
268 MarkSweepPolicy() {}
269
270 MarkSweepPolicy* as_mark_sweep_policy() { return this; }
271
272 void initialize_gc_policy_counters();
273 };
274
275 #endif // SHARE_VM_GC_SHARED_COLLECTORPOLICY_HPP
|