Mercurial > hg > graal-jvmci-8
comparison src/share/vm/memory/genMarkSweep.cpp @ 1836:894b1d7c7e01
6423256: GC stacks should use a better data structure
6942771: SEGV in ParScanThreadState::take_from_overflow_stack
Reviewed-by: apetrusenko, ysr, pbk
author | jcoomes |
---|---|
date | Tue, 28 Sep 2010 15:56:15 -0700 |
parents | c18cbe5936b8 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1835:4805b9f4779e | 1836:894b1d7c7e01 |
---|---|
159 _preserved_count_max = 0; | 159 _preserved_count_max = 0; |
160 } | 160 } |
161 | 161 |
162 _preserved_marks = (PreservedMark*)scratch; | 162 _preserved_marks = (PreservedMark*)scratch; |
163 _preserved_count = 0; | 163 _preserved_count = 0; |
164 _preserved_mark_stack = NULL; | |
165 _preserved_oop_stack = NULL; | |
166 | |
167 _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); | |
168 _objarray_stack = new (ResourceObj::C_HEAP) GrowableArray<ObjArrayTask>(50, true); | |
169 | |
170 int size = SystemDictionary::number_of_classes() * 2; | |
171 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); | |
172 // (#klass/k)^2 for k ~ 10 appears to be a better fit, but this will have to do for | |
173 // now until we have had a chance to investigate a more optimal setting. | |
174 _revisit_mdo_stack = new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(2*size, true); | |
175 | 164 |
176 #ifdef VALIDATE_MARK_SWEEP | 165 #ifdef VALIDATE_MARK_SWEEP |
177 if (ValidateMarkSweep) { | 166 if (ValidateMarkSweep) { |
178 _root_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); | 167 _root_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); |
179 _other_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); | 168 _other_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); |
204 if (!UseG1GC) { | 193 if (!UseG1GC) { |
205 GenCollectedHeap* gch = GenCollectedHeap::heap(); | 194 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
206 gch->release_scratch(); | 195 gch->release_scratch(); |
207 } | 196 } |
208 | 197 |
209 if (_preserved_oop_stack) { | 198 _preserved_mark_stack.clear(true); |
210 delete _preserved_mark_stack; | 199 _preserved_oop_stack.clear(true); |
211 _preserved_mark_stack = NULL; | 200 _marking_stack.clear(); |
212 delete _preserved_oop_stack; | 201 _objarray_stack.clear(true); |
213 _preserved_oop_stack = NULL; | 202 _revisit_klass_stack.clear(true); |
214 } | 203 _revisit_mdo_stack.clear(true); |
215 | |
216 delete _marking_stack; | |
217 delete _objarray_stack; | |
218 delete _revisit_klass_stack; | |
219 delete _revisit_mdo_stack; | |
220 | 204 |
221 #ifdef VALIDATE_MARK_SWEEP | 205 #ifdef VALIDATE_MARK_SWEEP |
222 if (ValidateMarkSweep) { | 206 if (ValidateMarkSweep) { |
223 delete _root_refs_stack; | 207 delete _root_refs_stack; |
224 delete _other_refs_stack; | 208 delete _other_refs_stack; |
272 CodeCache::do_unloading(&is_alive, &keep_alive, purged_class); | 256 CodeCache::do_unloading(&is_alive, &keep_alive, purged_class); |
273 follow_stack(); // Flush marking stack | 257 follow_stack(); // Flush marking stack |
274 | 258 |
275 // Update subklass/sibling/implementor links of live klasses | 259 // Update subklass/sibling/implementor links of live klasses |
276 follow_weak_klass_links(); | 260 follow_weak_klass_links(); |
277 assert(_marking_stack->is_empty(), "just drained"); | 261 assert(_marking_stack.is_empty(), "just drained"); |
278 | 262 |
279 // Visit memoized MDO's and clear any unmarked weak refs | 263 // Visit memoized MDO's and clear any unmarked weak refs |
280 follow_mdo_weak_refs(); | 264 follow_mdo_weak_refs(); |
281 assert(_marking_stack->is_empty(), "just drained"); | 265 assert(_marking_stack.is_empty(), "just drained"); |
282 | 266 |
283 // Visit symbol and interned string tables and delete unmarked oops | 267 // Visit symbol and interned string tables and delete unmarked oops |
284 SymbolTable::unlink(&is_alive); | 268 SymbolTable::unlink(&is_alive); |
285 StringTable::unlink(&is_alive); | 269 StringTable::unlink(&is_alive); |
286 | 270 |
287 assert(_marking_stack->is_empty(), "stack should be empty by now"); | 271 assert(_marking_stack.is_empty(), "stack should be empty by now"); |
288 } | 272 } |
289 | 273 |
290 | 274 |
291 void GenMarkSweep::mark_sweep_phase2() { | 275 void GenMarkSweep::mark_sweep_phase2() { |
292 // Now all live objects are marked, compute the new object addresses. | 276 // Now all live objects are marked, compute the new object addresses. |