Mercurial > hg > graal-jvmci-8
annotate src/share/vm/memory/collectorPolicy.hpp @ 452:00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery.
Reviewed-by: apetrusenko, jcoomes
author | ysr |
---|---|
date | Thu, 20 Nov 2008 12:27:41 -0800 |
parents | 1ee8caae33af |
children | 0bfd3fb24150 |
rev | line source |
---|---|
0 | 1 /* |
196 | 2 * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
22 * | |
23 */ | |
24 | |
25 // This class (or more correctly, subtypes of this class) | |
26 // are used to define global garbage collector attributes. | |
27 // This includes initialization of generations and any other | |
28 // shared resources they may need. | |
29 // | |
30 // In general, all flag adjustment and validation should be | |
31 // done in initialize_flags(), which is called prior to | |
32 // initialize_size_info(). | |
33 // | |
34 // This class is not fully developed yet. As more collector(s) | |
35 // are added, it is expected that we will come across further | |
36 // behavior that requires global attention. The correct place | |
37 // to deal with those issues is this class. | |
38 | |
39 // Forward declarations. | |
40 class GenCollectorPolicy; | |
41 class TwoGenerationCollectorPolicy; | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
42 class AdaptiveSizePolicy; |
0 | 43 #ifndef SERIALGC |
44 class ConcurrentMarkSweepPolicy; | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
45 class G1CollectorPolicy; |
0 | 46 #endif // SERIALGC |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
47 |
0 | 48 class GCPolicyCounters; |
49 class PermanentGenerationSpec; | |
50 class MarkSweepPolicy; | |
51 | |
52 class CollectorPolicy : public CHeapObj { | |
53 protected: | |
54 PermanentGenerationSpec *_permanent_generation; | |
55 GCPolicyCounters* _gc_policy_counters; | |
56 | |
57 // Requires that the concrete subclass sets the alignment constraints | |
58 // before calling. | |
59 virtual void initialize_flags(); | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
60 virtual void initialize_size_info(); |
0 | 61 // Initialize "_permanent_generation" to a spec for the given kind of |
62 // Perm Gen. | |
63 void initialize_perm_generation(PermGen::Name pgnm); | |
64 | |
65 size_t _initial_heap_byte_size; | |
66 size_t _max_heap_byte_size; | |
67 size_t _min_heap_byte_size; | |
68 | |
69 size_t _min_alignment; | |
70 size_t _max_alignment; | |
71 | |
72 CollectorPolicy() : | |
73 _min_alignment(1), | |
74 _max_alignment(1), | |
75 _initial_heap_byte_size(0), | |
76 _max_heap_byte_size(0), | |
77 _min_heap_byte_size(0) | |
78 {} | |
79 | |
80 public: | |
81 void set_min_alignment(size_t align) { _min_alignment = align; } | |
82 size_t min_alignment() { return _min_alignment; } | |
83 void set_max_alignment(size_t align) { _max_alignment = align; } | |
84 size_t max_alignment() { return _max_alignment; } | |
85 | |
86 size_t initial_heap_byte_size() { return _initial_heap_byte_size; } | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
87 void set_initial_heap_byte_size(size_t v) { _initial_heap_byte_size = v; } |
0 | 88 size_t max_heap_byte_size() { return _max_heap_byte_size; } |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
89 void set_max_heap_byte_size(size_t v) { _max_heap_byte_size = v; } |
0 | 90 size_t min_heap_byte_size() { return _min_heap_byte_size; } |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
91 void set_min_heap_byte_size(size_t v) { _min_heap_byte_size = v; } |
0 | 92 |
93 enum Name { | |
94 CollectorPolicyKind, | |
95 TwoGenerationCollectorPolicyKind, | |
96 ConcurrentMarkSweepPolicyKind, | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
97 ASConcurrentMarkSweepPolicyKind, |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
98 G1CollectorPolicyKind |
0 | 99 }; |
100 | |
101 // Identification methods. | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
102 virtual GenCollectorPolicy* as_generation_policy() { return NULL; } |
0 | 103 virtual TwoGenerationCollectorPolicy* as_two_generation_policy() { return NULL; } |
104 virtual MarkSweepPolicy* as_mark_sweep_policy() { return NULL; } | |
105 #ifndef SERIALGC | |
106 virtual ConcurrentMarkSweepPolicy* as_concurrent_mark_sweep_policy() { return NULL; } | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
107 virtual G1CollectorPolicy* as_g1_policy() { return NULL; } |
0 | 108 #endif // SERIALGC |
109 // Note that these are not virtual. | |
110 bool is_generation_policy() { return as_generation_policy() != NULL; } | |
111 bool is_two_generation_policy() { return as_two_generation_policy() != NULL; } | |
112 bool is_mark_sweep_policy() { return as_mark_sweep_policy() != NULL; } | |
113 #ifndef SERIALGC | |
114 bool is_concurrent_mark_sweep_policy() { return as_concurrent_mark_sweep_policy() != NULL; } | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
115 bool is_g1_policy() { return as_g1_policy() != NULL; } |
0 | 116 #else // SERIALGC |
117 bool is_concurrent_mark_sweep_policy() { return false; } | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
118 bool is_g1_policy() { return false; } |
0 | 119 #endif // SERIALGC |
120 | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
13
diff
changeset
|
121 |
0 | 122 virtual PermanentGenerationSpec *permanent_generation() { |
123 assert(_permanent_generation != NULL, "Sanity check"); | |
124 return _permanent_generation; | |
125 } | |
126 | |
127 virtual BarrierSet::Name barrier_set_name() = 0; | |
128 virtual GenRemSet::Name rem_set_name() = 0; | |
129 | |
130 // Create the remembered set (to cover the given reserved region, | |
131 // allowing breaking up into at most "max_covered_regions"). | |
132 virtual GenRemSet* create_rem_set(MemRegion reserved, | |
133 int max_covered_regions); | |
134 | |
135 // This method controls how a collector satisfies a request | |
136 // for a block of memory. "gc_time_limit_was_exceeded" will | |
137 // be set to true if the adaptive size policy determine that | |
138 // an excessive amount of time is being spent doing collections | |
139 // and caused a NULL to be returned. If a NULL is not returned, | |
140 // "gc_time_limit_was_exceeded" has an undefined meaning. | |
141 virtual HeapWord* mem_allocate_work(size_t size, | |
142 bool is_tlab, | |
143 bool* gc_overhead_limit_was_exceeded) = 0; | |
144 | |
145 // This method controls how a collector handles one or more | |
146 // of its generations being fully allocated. | |
147 virtual HeapWord *satisfy_failed_allocation(size_t size, bool is_tlab) = 0; | |
148 // Performace Counter support | |
149 GCPolicyCounters* counters() { return _gc_policy_counters; } | |
150 | |
151 // Create the jstat counters for the GC policy. By default, policy's | |
152 // don't have associated counters, and we complain if this is invoked. | |
153 virtual void initialize_gc_policy_counters() { | |
154 ShouldNotReachHere(); | |
155 } | |
156 | |
157 virtual CollectorPolicy::Name kind() { | |
158 return CollectorPolicy::CollectorPolicyKind; | |
159 } | |
160 | |
161 // Returns true if a collector has eden space with soft end. | |
162 virtual bool has_soft_ended_eden() { | |
163 return false; | |
164 } | |
165 | |
166 }; | |
167 | |
168 class GenCollectorPolicy : public CollectorPolicy { | |
169 protected: | |
170 size_t _min_gen0_size; | |
171 size_t _initial_gen0_size; | |
172 size_t _max_gen0_size; | |
173 | |
174 GenerationSpec **_generations; | |
175 | |
176 // The sizing of the different generations in the heap are controlled | |
177 // by a sizing policy. | |
178 AdaptiveSizePolicy* _size_policy; | |
179 | |
180 // Return true if an allocation should be attempted in the older | |
181 // generation if it fails in the younger generation. Return | |
182 // false, otherwise. | |
183 virtual bool should_try_older_generation_allocation(size_t word_size) const; | |
184 | |
185 void initialize_flags(); | |
186 void initialize_size_info(); | |
187 | |
188 // Try to allocate space by expanding the heap. | |
189 virtual HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab); | |
190 | |
191 // compute max heap alignment | |
192 size_t compute_max_alignment(); | |
193 | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
194 // Scale the base_size by NewRation according to |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
195 // result = base_size / (NewRatio + 1) |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
196 // and align by min_alignment() |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
197 size_t scale_by_NewRatio_aligned(size_t base_size); |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
198 |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
199 // Bound the value by the given maximum minus the |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
200 // min_alignment. |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
201 size_t bound_minus_alignment(size_t desired_size, size_t maximum_size); |
0 | 202 |
203 public: | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
204 // Accessors |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
205 size_t min_gen0_size() { return _min_gen0_size; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
206 void set_min_gen0_size(size_t v) { _min_gen0_size = v; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
207 size_t initial_gen0_size() { return _initial_gen0_size; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
208 void set_initial_gen0_size(size_t v) { _initial_gen0_size = v; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
209 size_t max_gen0_size() { return _max_gen0_size; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
210 void set_max_gen0_size(size_t v) { _max_gen0_size = v; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
211 |
0 | 212 virtual int number_of_generations() = 0; |
213 | |
214 virtual GenerationSpec **generations() { | |
215 assert(_generations != NULL, "Sanity check"); | |
216 return _generations; | |
217 } | |
218 | |
219 virtual GenCollectorPolicy* as_generation_policy() { return this; } | |
220 | |
221 virtual void initialize_generations() = 0; | |
222 | |
223 virtual void initialize_all() { | |
224 initialize_flags(); | |
225 initialize_size_info(); | |
226 initialize_generations(); | |
227 } | |
228 | |
229 HeapWord* mem_allocate_work(size_t size, | |
230 bool is_tlab, | |
231 bool* gc_overhead_limit_was_exceeded); | |
232 | |
233 HeapWord *satisfy_failed_allocation(size_t size, bool is_tlab); | |
234 | |
235 // The size that defines a "large array". | |
236 virtual size_t large_typearray_limit(); | |
237 | |
238 // Adaptive size policy | |
239 AdaptiveSizePolicy* size_policy() { return _size_policy; } | |
240 virtual void initialize_size_policy(size_t init_eden_size, | |
241 size_t init_promo_size, | |
242 size_t init_survivor_size); | |
243 | |
244 }; | |
245 | |
246 | |
247 // All of hotspot's current collectors are subtypes of this | |
248 // class. Currently, these collectors all use the same gen[0], | |
249 // but have different gen[1] types. If we add another subtype | |
250 // of CollectorPolicy, this class should be broken out into | |
251 // its own file. | |
252 | |
253 class TwoGenerationCollectorPolicy : public GenCollectorPolicy { | |
254 protected: | |
255 size_t _min_gen1_size; | |
256 size_t _initial_gen1_size; | |
257 size_t _max_gen1_size; | |
258 | |
259 void initialize_flags(); | |
260 void initialize_size_info(); | |
261 void initialize_generations() { ShouldNotReachHere(); } | |
262 | |
263 public: | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
264 // Accessors |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
265 size_t min_gen1_size() { return _min_gen1_size; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
266 void set_min_gen1_size(size_t v) { _min_gen1_size = v; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
267 size_t initial_gen1_size() { return _initial_gen1_size; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
268 void set_initial_gen1_size(size_t v) { _initial_gen1_size = v; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
269 size_t max_gen1_size() { return _max_gen1_size; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
270 void set_max_gen1_size(size_t v) { _max_gen1_size = v; } |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
271 |
0 | 272 // Inherited methods |
273 TwoGenerationCollectorPolicy* as_two_generation_policy() { return this; } | |
274 | |
275 int number_of_generations() { return 2; } | |
276 BarrierSet::Name barrier_set_name() { return BarrierSet::CardTableModRef; } | |
277 GenRemSet::Name rem_set_name() { return GenRemSet::CardTable; } | |
278 | |
279 virtual CollectorPolicy::Name kind() { | |
280 return CollectorPolicy::TwoGenerationCollectorPolicyKind; | |
281 } | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
282 |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
283 // Returns true is gen0 sizes were adjusted |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
284 bool adjust_gen0_sizes(size_t* gen0_size_ptr, size_t* gen1_size_ptr, |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
285 size_t heap_size, size_t min_gen1_size); |
0 | 286 }; |
287 | |
288 class MarkSweepPolicy : public TwoGenerationCollectorPolicy { | |
289 protected: | |
290 void initialize_generations(); | |
291 | |
292 public: | |
293 MarkSweepPolicy(); | |
294 | |
295 MarkSweepPolicy* as_mark_sweep_policy() { return this; } | |
296 | |
297 void initialize_gc_policy_counters(); | |
298 }; |