506 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
507 // Recursively traverse all live objects and mark them
508 GCTraceTime(Info, gc, phases) tm("Phase 1: Mark live objects", _gc_timer);
509
510 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
511
512 // Need to clear claim bits before the tracing starts.
513 ClassLoaderDataGraph::clear_claimed_marks();
514
515 // General strong roots.
516 {
517 ParallelScavengeHeap::ParStrongRootsScope psrs;
518 Universe::oops_do(mark_and_push_closure());
519 JNIHandles::oops_do(mark_and_push_closure()); // Global (strong) JNI handles
520 MarkingCodeBlobClosure each_active_code_blob(mark_and_push_closure(), !CodeBlobToOopClosure::FixRelocations);
521 Threads::oops_do(mark_and_push_closure(), &each_active_code_blob);
522 ObjectSynchronizer::oops_do(mark_and_push_closure());
523 Management::oops_do(mark_and_push_closure());
524 JvmtiExport::oops_do(mark_and_push_closure());
525 SystemDictionary::oops_do(mark_and_push_closure());
526 ClassLoaderDataGraph::always_strong_cld_oops_do(follow_cld_closure());
527 // Do not treat nmethods as strong roots for mark/sweep, since we can unload them.
528 //CodeCache::scavenge_root_nmethods_do(CodeBlobToOopClosure(mark_and_push_closure()));
529 AOTLoader::oops_do(mark_and_push_closure());
530 }
531
532 // Flush marking stack.
533 follow_stack();
534
535 // Process reference objects found during marking
536 {
537 GCTraceTime(Debug, gc, phases) t("Reference Processing", _gc_timer);
538
539 ref_processor()->setup_policy(clear_all_softrefs);
540 ReferenceProcessorPhaseTimes pt(_gc_timer, ref_processor()->max_num_queues());
541 const ReferenceProcessorStats& stats =
542 ref_processor()->process_discovered_references(
543 is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL, &pt);
544 gc_tracer()->report_gc_reference_stats(stats);
545 pt.print_all_references();
546 }
603
604 void PSMarkSweep::mark_sweep_phase3() {
605 // Adjust the pointers to reflect the new locations
606 GCTraceTime(Info, gc, phases) tm("Phase 3: Adjust pointers", _gc_timer);
607
608 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
609 PSYoungGen* young_gen = heap->young_gen();
610 PSOldGen* old_gen = heap->old_gen();
611
612 // Need to clear claim bits before the tracing starts.
613 ClassLoaderDataGraph::clear_claimed_marks();
614
615 // General strong roots.
616 Universe::oops_do(adjust_pointer_closure());
617 JNIHandles::oops_do(adjust_pointer_closure()); // Global (strong) JNI handles
618 Threads::oops_do(adjust_pointer_closure(), NULL);
619 ObjectSynchronizer::oops_do(adjust_pointer_closure());
620 Management::oops_do(adjust_pointer_closure());
621 JvmtiExport::oops_do(adjust_pointer_closure());
622 SystemDictionary::oops_do(adjust_pointer_closure());
623 ClassLoaderDataGraph::cld_oops_do(adjust_cld_closure());
624
625 // Now adjust pointers in remaining weak roots. (All of which should
626 // have been cleared if they pointed to non-surviving objects.)
627 // Global (weak) JNI handles
628 WeakProcessor::oops_do(adjust_pointer_closure());
629
630 CodeBlobToOopClosure adjust_from_blobs(adjust_pointer_closure(), CodeBlobToOopClosure::FixRelocations);
631 CodeCache::blobs_do(&adjust_from_blobs);
632 AOTLoader::oops_do(adjust_pointer_closure());
633 StringTable::oops_do(adjust_pointer_closure());
634 ref_processor()->weak_oops_do(adjust_pointer_closure());
635 PSScavenge::reference_processor()->weak_oops_do(adjust_pointer_closure());
636
637 adjust_marks();
638
639 young_gen->adjust_pointers();
640 old_gen->adjust_pointers();
641 }
642
643 void PSMarkSweep::mark_sweep_phase4() {
|
506 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
507 // Recursively traverse all live objects and mark them
508 GCTraceTime(Info, gc, phases) tm("Phase 1: Mark live objects", _gc_timer);
509
510 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
511
512 // Need to clear claim bits before the tracing starts.
513 ClassLoaderDataGraph::clear_claimed_marks();
514
515 // General strong roots.
516 {
517 ParallelScavengeHeap::ParStrongRootsScope psrs;
518 Universe::oops_do(mark_and_push_closure());
519 JNIHandles::oops_do(mark_and_push_closure()); // Global (strong) JNI handles
520 MarkingCodeBlobClosure each_active_code_blob(mark_and_push_closure(), !CodeBlobToOopClosure::FixRelocations);
521 Threads::oops_do(mark_and_push_closure(), &each_active_code_blob);
522 ObjectSynchronizer::oops_do(mark_and_push_closure());
523 Management::oops_do(mark_and_push_closure());
524 JvmtiExport::oops_do(mark_and_push_closure());
525 SystemDictionary::oops_do(mark_and_push_closure());
526 ClassLoaderDataGraph::always_strong_cld_do(follow_cld_closure());
527 // Do not treat nmethods as strong roots for mark/sweep, since we can unload them.
528 //CodeCache::scavenge_root_nmethods_do(CodeBlobToOopClosure(mark_and_push_closure()));
529 AOTLoader::oops_do(mark_and_push_closure());
530 }
531
532 // Flush marking stack.
533 follow_stack();
534
535 // Process reference objects found during marking
536 {
537 GCTraceTime(Debug, gc, phases) t("Reference Processing", _gc_timer);
538
539 ref_processor()->setup_policy(clear_all_softrefs);
540 ReferenceProcessorPhaseTimes pt(_gc_timer, ref_processor()->max_num_queues());
541 const ReferenceProcessorStats& stats =
542 ref_processor()->process_discovered_references(
543 is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL, &pt);
544 gc_tracer()->report_gc_reference_stats(stats);
545 pt.print_all_references();
546 }
603
604 void PSMarkSweep::mark_sweep_phase3() {
605 // Adjust the pointers to reflect the new locations
606 GCTraceTime(Info, gc, phases) tm("Phase 3: Adjust pointers", _gc_timer);
607
608 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
609 PSYoungGen* young_gen = heap->young_gen();
610 PSOldGen* old_gen = heap->old_gen();
611
612 // Need to clear claim bits before the tracing starts.
613 ClassLoaderDataGraph::clear_claimed_marks();
614
615 // General strong roots.
616 Universe::oops_do(adjust_pointer_closure());
617 JNIHandles::oops_do(adjust_pointer_closure()); // Global (strong) JNI handles
618 Threads::oops_do(adjust_pointer_closure(), NULL);
619 ObjectSynchronizer::oops_do(adjust_pointer_closure());
620 Management::oops_do(adjust_pointer_closure());
621 JvmtiExport::oops_do(adjust_pointer_closure());
622 SystemDictionary::oops_do(adjust_pointer_closure());
623 ClassLoaderDataGraph::cld_do(adjust_cld_closure());
624
625 // Now adjust pointers in remaining weak roots. (All of which should
626 // have been cleared if they pointed to non-surviving objects.)
627 // Global (weak) JNI handles
628 WeakProcessor::oops_do(adjust_pointer_closure());
629
630 CodeBlobToOopClosure adjust_from_blobs(adjust_pointer_closure(), CodeBlobToOopClosure::FixRelocations);
631 CodeCache::blobs_do(&adjust_from_blobs);
632 AOTLoader::oops_do(adjust_pointer_closure());
633 StringTable::oops_do(adjust_pointer_closure());
634 ref_processor()->weak_oops_do(adjust_pointer_closure());
635 PSScavenge::reference_processor()->weak_oops_do(adjust_pointer_closure());
636
637 adjust_marks();
638
639 young_gen->adjust_pointers();
640 old_gen->adjust_pointers();
641 }
642
643 void PSMarkSweep::mark_sweep_phase4() {
|