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.