comparison src/share/vm/memory/genMarkSweep.cpp @ 1311:2a1472c30599

4396719: Mark Sweep stack overflow on deeply nested Object arrays Summary: Use an explicit stack for object arrays and process them in chunks. Reviewed-by: iveresov, apetrusenko
author jcoomes
date Wed, 03 Mar 2010 14:48:26 -0800
parents a1423fe86a18
children 0bfd3fb24150
comparison
equal deleted inserted replaced
1289:d47555d7aca8 1311:2a1472c30599
157 _preserved_count = 0; 157 _preserved_count = 0;
158 _preserved_mark_stack = NULL; 158 _preserved_mark_stack = NULL;
159 _preserved_oop_stack = NULL; 159 _preserved_oop_stack = NULL;
160 160
161 _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); 161 _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true);
162 _objarray_stack = new (ResourceObj::C_HEAP) GrowableArray<ObjArrayTask>(50, true);
162 163
163 int size = SystemDictionary::number_of_classes() * 2; 164 int size = SystemDictionary::number_of_classes() * 2;
164 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); 165 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true);
165 // (#klass/k)^2 for k ~ 10 appears to be a better fit, but this will have to do for 166 // (#klass/k)^2 for k ~ 10 appears to be a better fit, but this will have to do for
166 // now until we have had a chance to investigate a more optimal setting. 167 // now until we have had a chance to investigate a more optimal setting.
192 #endif 193 #endif
193 } 194 }
194 195
195 196
196 void GenMarkSweep::deallocate_stacks() { 197 void GenMarkSweep::deallocate_stacks() {
197
198 if (!UseG1GC) { 198 if (!UseG1GC) {
199 GenCollectedHeap* gch = GenCollectedHeap::heap(); 199 GenCollectedHeap* gch = GenCollectedHeap::heap();
200 gch->release_scratch(); 200 gch->release_scratch();
201 } 201 }
202 202
206 delete _preserved_oop_stack; 206 delete _preserved_oop_stack;
207 _preserved_oop_stack = NULL; 207 _preserved_oop_stack = NULL;
208 } 208 }
209 209
210 delete _marking_stack; 210 delete _marking_stack;
211 delete _objarray_stack;
211 delete _revisit_klass_stack; 212 delete _revisit_klass_stack;
212 delete _revisit_mdo_stack; 213 delete _revisit_mdo_stack;
213 214
214 #ifdef VALIDATE_MARK_SWEEP 215 #ifdef VALIDATE_MARK_SWEEP
215 if (ValidateMarkSweep) { 216 if (ValidateMarkSweep) {