553
554 void PSMarkSweep::mark_sweep_phase2() {
555 GCTraceTime(Trace, gc) tm("Phase 2: Compute new object addresses", _gc_timer);
556
557 // Now all live objects are marked, compute the new object addresses.
558
559 // It is not required that we traverse spaces in the same order in
560 // phase2, phase3 and phase4, but the ValidateMarkSweep live oops
561 // tracking expects us to do so. See comment under phase4.
562
563 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
564 PSOldGen* old_gen = heap->old_gen();
565
566 // Begin compacting into the old gen
567 PSMarkSweepDecorator::set_destination_decorator_tenured();
568
569 // This will also compact the young gen spaces.
570 old_gen->precompact();
571 }
572
573 // This should be moved to the shared markSweep code!
574 class PSAlwaysTrueClosure: public BoolObjectClosure {
575 public:
576 bool do_object_b(oop p) { return true; }
577 };
578 static PSAlwaysTrueClosure always_true;
579
580 void PSMarkSweep::mark_sweep_phase3() {
581 // Adjust the pointers to reflect the new locations
582 GCTraceTime(Trace, gc) tm("Phase 3: Adjust pointers", _gc_timer);
583
584 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
585 PSYoungGen* young_gen = heap->young_gen();
586 PSOldGen* old_gen = heap->old_gen();
587
588 // Need to clear claim bits before the tracing starts.
589 ClassLoaderDataGraph::clear_claimed_marks();
590
591 // General strong roots.
592 Universe::oops_do(adjust_pointer_closure());
593 JNIHandles::oops_do(adjust_pointer_closure()); // Global (strong) JNI handles
594 CLDToOopClosure adjust_from_cld(adjust_pointer_closure());
595 Threads::oops_do(adjust_pointer_closure(), &adjust_from_cld, NULL);
596 ObjectSynchronizer::oops_do(adjust_pointer_closure());
597 FlatProfiler::oops_do(adjust_pointer_closure());
598 Management::oops_do(adjust_pointer_closure());
599 JvmtiExport::oops_do(adjust_pointer_closure());
600 SystemDictionary::oops_do(adjust_pointer_closure());
601 ClassLoaderDataGraph::cld_do(adjust_cld_closure());
602
603 // Now adjust pointers in remaining weak roots. (All of which should
604 // have been cleared if they pointed to non-surviving objects.)
605 // Global (weak) JNI handles
606 JNIHandles::weak_oops_do(&always_true, adjust_pointer_closure());
607
608 CodeBlobToOopClosure adjust_from_blobs(adjust_pointer_closure(), CodeBlobToOopClosure::FixRelocations);
609 CodeCache::blobs_do(&adjust_from_blobs);
610 StringTable::oops_do(adjust_pointer_closure());
611 ref_processor()->weak_oops_do(adjust_pointer_closure());
612 PSScavenge::reference_processor()->weak_oops_do(adjust_pointer_closure());
613
614 adjust_marks();
615
616 young_gen->adjust_pointers();
617 old_gen->adjust_pointers();
618 }
619
620 void PSMarkSweep::mark_sweep_phase4() {
621 EventMark m("4 compact heap");
622 GCTraceTime(Trace, gc) tm("Phase 4: Move objects", _gc_timer);
623
624 // All pointers are now adjusted, move objects accordingly
625
626 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
|
553
554 void PSMarkSweep::mark_sweep_phase2() {
555 GCTraceTime(Trace, gc) tm("Phase 2: Compute new object addresses", _gc_timer);
556
557 // Now all live objects are marked, compute the new object addresses.
558
559 // It is not required that we traverse spaces in the same order in
560 // phase2, phase3 and phase4, but the ValidateMarkSweep live oops
561 // tracking expects us to do so. See comment under phase4.
562
563 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
564 PSOldGen* old_gen = heap->old_gen();
565
566 // Begin compacting into the old gen
567 PSMarkSweepDecorator::set_destination_decorator_tenured();
568
569 // This will also compact the young gen spaces.
570 old_gen->precompact();
571 }
572
573 void PSMarkSweep::mark_sweep_phase3() {
574 // Adjust the pointers to reflect the new locations
575 GCTraceTime(Trace, gc) tm("Phase 3: Adjust pointers", _gc_timer);
576
577 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
578 PSYoungGen* young_gen = heap->young_gen();
579 PSOldGen* old_gen = heap->old_gen();
580
581 // Need to clear claim bits before the tracing starts.
582 ClassLoaderDataGraph::clear_claimed_marks();
583
584 // General strong roots.
585 Universe::oops_do(adjust_pointer_closure());
586 JNIHandles::oops_do(adjust_pointer_closure()); // Global (strong) JNI handles
587 CLDToOopClosure adjust_from_cld(adjust_pointer_closure());
588 Threads::oops_do(adjust_pointer_closure(), &adjust_from_cld, NULL);
589 ObjectSynchronizer::oops_do(adjust_pointer_closure());
590 FlatProfiler::oops_do(adjust_pointer_closure());
591 Management::oops_do(adjust_pointer_closure());
592 JvmtiExport::oops_do(adjust_pointer_closure());
593 SystemDictionary::oops_do(adjust_pointer_closure());
594 ClassLoaderDataGraph::cld_do(adjust_cld_closure());
595
596 // Now adjust pointers in remaining weak roots. (All of which should
597 // have been cleared if they pointed to non-surviving objects.)
598 // Global (weak) JNI handles
599 JNIHandles::weak_oops_do(adjust_pointer_closure());
600
601 CodeBlobToOopClosure adjust_from_blobs(adjust_pointer_closure(), CodeBlobToOopClosure::FixRelocations);
602 CodeCache::blobs_do(&adjust_from_blobs);
603 StringTable::oops_do(adjust_pointer_closure());
604 ref_processor()->weak_oops_do(adjust_pointer_closure());
605 PSScavenge::reference_processor()->weak_oops_do(adjust_pointer_closure());
606
607 adjust_marks();
608
609 young_gen->adjust_pointers();
610 old_gen->adjust_pointers();
611 }
612
613 void PSMarkSweep::mark_sweep_phase4() {
614 EventMark m("4 compact heap");
615 GCTraceTime(Trace, gc) tm("Phase 4: Move objects", _gc_timer);
616
617 // All pointers are now adjusted, move objects accordingly
618
619 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
|