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) {