Mercurial > hg > truffle
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) { |