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"); |