Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.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 | 54b3b351d6f9 |
children | 0bfd3fb24150 |
comparison
equal
deleted
inserted
replaced
1289:d47555d7aca8 | 1311:2a1472c30599 |
---|---|
477 | 477 |
478 _preserved_mark_stack = NULL; | 478 _preserved_mark_stack = NULL; |
479 _preserved_oop_stack = NULL; | 479 _preserved_oop_stack = NULL; |
480 | 480 |
481 _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); | 481 _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); |
482 _objarray_stack = new (ResourceObj::C_HEAP) GrowableArray<ObjArrayTask>(50, true); | |
482 | 483 |
483 int size = SystemDictionary::number_of_classes() * 2; | 484 int size = SystemDictionary::number_of_classes() * 2; |
484 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); | 485 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); |
485 // (#klass/k)^2, for k ~ 10 appears a better setting, but this will have to do for | 486 // (#klass/k)^2, for k ~ 10 appears a better setting, but this will have to do for |
486 // now until we investigate a more optimal setting. | 487 // now until we investigate a more optimal setting. |
495 delete _preserved_oop_stack; | 496 delete _preserved_oop_stack; |
496 _preserved_oop_stack = NULL; | 497 _preserved_oop_stack = NULL; |
497 } | 498 } |
498 | 499 |
499 delete _marking_stack; | 500 delete _marking_stack; |
501 delete _objarray_stack; | |
500 delete _revisit_klass_stack; | 502 delete _revisit_klass_stack; |
501 delete _revisit_mdo_stack; | 503 delete _revisit_mdo_stack; |
502 } | 504 } |
503 | 505 |
504 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) { | 506 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) { |