Mercurial > hg > graal-compiler
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"); |