comparison src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.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
464 464
465 // We want to calculate the size in bytes first. 465 // We want to calculate the size in bytes first.
466 _preserved_count_max = pointer_delta(to_space->end(), to_space->top(), sizeof(jbyte)); 466 _preserved_count_max = pointer_delta(to_space->end(), to_space->top(), sizeof(jbyte));
467 // Now divide by the size of a PreservedMark 467 // Now divide by the size of a PreservedMark
468 _preserved_count_max /= sizeof(PreservedMark); 468 _preserved_count_max /= sizeof(PreservedMark);
469
470 _preserved_mark_stack = NULL;
471 _preserved_oop_stack = NULL;
472
473 _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true);
474 _objarray_stack = new (ResourceObj::C_HEAP) GrowableArray<ObjArrayTask>(50, true);
475
476 int size = SystemDictionary::number_of_classes() * 2;
477 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true);
478 // (#klass/k)^2, for k ~ 10 appears a better setting, but this will have to do for
479 // now until we investigate a more optimal setting.
480 _revisit_mdo_stack = new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(size*2, true);
481 } 469 }
482 470
483 471
484 void PSMarkSweep::deallocate_stacks() { 472 void PSMarkSweep::deallocate_stacks() {
485 if (_preserved_oop_stack) { 473 _preserved_mark_stack.clear(true);
486 delete _preserved_mark_stack; 474 _preserved_oop_stack.clear(true);
487 _preserved_mark_stack = NULL; 475 _marking_stack.clear();
488 delete _preserved_oop_stack; 476 _objarray_stack.clear(true);
489 _preserved_oop_stack = NULL; 477 _revisit_klass_stack.clear(true);
490 } 478 _revisit_mdo_stack.clear(true);
491
492 delete _marking_stack;
493 delete _objarray_stack;
494 delete _revisit_klass_stack;
495 delete _revisit_mdo_stack;
496 } 479 }
497 480
498 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) { 481 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
499 // Recursively traverse all live objects and mark them 482 // Recursively traverse all live objects and mark them
500 EventMark m("1 mark object"); 483 EventMark m("1 mark object");
540 purged_class); 523 purged_class);
541 follow_stack(); // Flush marking stack 524 follow_stack(); // Flush marking stack
542 525
543 // Update subklass/sibling/implementor links of live klasses 526 // Update subklass/sibling/implementor links of live klasses
544 follow_weak_klass_links(); 527 follow_weak_klass_links();
545 assert(_marking_stack->is_empty(), "just drained"); 528 assert(_marking_stack.is_empty(), "just drained");
546 529
547 // Visit memoized mdo's and clear unmarked weak refs 530 // Visit memoized mdo's and clear unmarked weak refs
548 follow_mdo_weak_refs(); 531 follow_mdo_weak_refs();
549 assert(_marking_stack->is_empty(), "just drained"); 532 assert(_marking_stack.is_empty(), "just drained");
550 533
551 // Visit symbol and interned string tables and delete unmarked oops 534 // Visit symbol and interned string tables and delete unmarked oops
552 SymbolTable::unlink(is_alive_closure()); 535 SymbolTable::unlink(is_alive_closure());
553 StringTable::unlink(is_alive_closure()); 536 StringTable::unlink(is_alive_closure());
554 537
555 assert(_marking_stack->is_empty(), "stack should be empty by now"); 538 assert(_marking_stack.is_empty(), "stack should be empty by now");
556 } 539 }
557 540
558 541
559 void PSMarkSweep::mark_sweep_phase2() { 542 void PSMarkSweep::mark_sweep_phase2() {
560 EventMark m("2 compute new addresses"); 543 EventMark m("2 compute new addresses");