src/share/vm/gc/parallel/psMarkSweep.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File webrev Sdiff src/share/vm/gc/parallel

src/share/vm/gc/parallel/psMarkSweep.cpp

Print this page




  33 #include "gc/parallel/psMarkSweep.hpp"
  34 #include "gc/parallel/psMarkSweepDecorator.hpp"
  35 #include "gc/parallel/psOldGen.hpp"
  36 #include "gc/parallel/psScavenge.hpp"
  37 #include "gc/parallel/psYoungGen.hpp"
  38 #include "gc/serial/markSweep.hpp"
  39 #include "gc/shared/gcCause.hpp"
  40 #include "gc/shared/gcHeapSummary.hpp"
  41 #include "gc/shared/gcId.hpp"
  42 #include "gc/shared/gcLocker.inline.hpp"
  43 #include "gc/shared/gcTimer.hpp"
  44 #include "gc/shared/gcTrace.hpp"
  45 #include "gc/shared/gcTraceTime.inline.hpp"
  46 #include "gc/shared/isGCActiveMark.hpp"
  47 #include "gc/shared/referencePolicy.hpp"
  48 #include "gc/shared/referenceProcessor.hpp"
  49 #include "gc/shared/spaceDecorator.hpp"
  50 #include "logging/log.hpp"
  51 #include "oops/oop.inline.hpp"
  52 #include "runtime/biasedLocking.hpp"
  53 #include "runtime/fprofiler.hpp"
  54 #include "runtime/safepoint.hpp"
  55 #include "runtime/vmThread.hpp"
  56 #include "services/management.hpp"
  57 #include "services/memoryService.hpp"
  58 #include "utilities/align.hpp"
  59 #include "utilities/events.hpp"
  60 #include "utilities/stack.inline.hpp"
  61 
  62 elapsedTimer        PSMarkSweep::_accumulated_time;
  63 jlong               PSMarkSweep::_time_of_last_gc   = 0;
  64 CollectorCounters*  PSMarkSweep::_counters = NULL;
  65 
  66 void PSMarkSweep::initialize() {
  67   MemRegion mr = ParallelScavengeHeap::heap()->reserved_region();
  68   set_ref_processor(new ReferenceProcessor(mr));     // a vanilla ref proc
  69   _counters = new CollectorCounters("PSMarkSweep", 1);
  70 }
  71 
  72 // This method contains all heap specific policy for invoking mark sweep.
  73 // PSMarkSweep::invoke_no_policy() will only attempt to mark-sweep-compact


 493   _objarray_stack.clear(true);
 494 }
 495 
 496 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
 497   // Recursively traverse all live objects and mark them
 498   GCTraceTime(Info, gc, phases) tm("Phase 1: Mark live objects", _gc_timer);
 499 
 500   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
 501 
 502   // Need to clear claim bits before the tracing starts.
 503   ClassLoaderDataGraph::clear_claimed_marks();
 504 
 505   // General strong roots.
 506   {
 507     ParallelScavengeHeap::ParStrongRootsScope psrs;
 508     Universe::oops_do(mark_and_push_closure());
 509     JNIHandles::oops_do(mark_and_push_closure());   // Global (strong) JNI handles
 510     MarkingCodeBlobClosure each_active_code_blob(mark_and_push_closure(), !CodeBlobToOopClosure::FixRelocations);
 511     Threads::oops_do(mark_and_push_closure(), &each_active_code_blob);
 512     ObjectSynchronizer::oops_do(mark_and_push_closure());
 513     FlatProfiler::oops_do(mark_and_push_closure());
 514     Management::oops_do(mark_and_push_closure());
 515     JvmtiExport::oops_do(mark_and_push_closure());
 516     SystemDictionary::always_strong_oops_do(mark_and_push_closure());
 517     ClassLoaderDataGraph::always_strong_cld_do(follow_cld_closure());
 518     // Do not treat nmethods as strong roots for mark/sweep, since we can unload them.
 519     //CodeCache::scavenge_root_nmethods_do(CodeBlobToOopClosure(mark_and_push_closure()));
 520     AOTLoader::oops_do(mark_and_push_closure());
 521   }
 522 
 523   // Flush marking stack.
 524   follow_stack();
 525 
 526   // Process reference objects found during marking
 527   {
 528     GCTraceTime(Debug, gc, phases) t("Reference Processing", _gc_timer);
 529 
 530     ref_processor()->setup_policy(clear_all_softrefs);
 531     const ReferenceProcessorStats& stats =
 532       ref_processor()->process_discovered_references(
 533         is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL, _gc_timer);


 584   // This will also compact the young gen spaces.
 585   old_gen->precompact();
 586 }
 587 
 588 void PSMarkSweep::mark_sweep_phase3() {
 589   // Adjust the pointers to reflect the new locations
 590   GCTraceTime(Info, gc, phases) tm("Phase 3: Adjust pointers", _gc_timer);
 591 
 592   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
 593   PSYoungGen* young_gen = heap->young_gen();
 594   PSOldGen* old_gen = heap->old_gen();
 595 
 596   // Need to clear claim bits before the tracing starts.
 597   ClassLoaderDataGraph::clear_claimed_marks();
 598 
 599   // General strong roots.
 600   Universe::oops_do(adjust_pointer_closure());
 601   JNIHandles::oops_do(adjust_pointer_closure());   // Global (strong) JNI handles
 602   Threads::oops_do(adjust_pointer_closure(), NULL);
 603   ObjectSynchronizer::oops_do(adjust_pointer_closure());
 604   FlatProfiler::oops_do(adjust_pointer_closure());
 605   Management::oops_do(adjust_pointer_closure());
 606   JvmtiExport::oops_do(adjust_pointer_closure());
 607   SystemDictionary::oops_do(adjust_pointer_closure());
 608   ClassLoaderDataGraph::cld_do(adjust_cld_closure());
 609 
 610   // Now adjust pointers in remaining weak roots.  (All of which should
 611   // have been cleared if they pointed to non-surviving objects.)
 612   // Global (weak) JNI handles
 613   JNIHandles::weak_oops_do(adjust_pointer_closure());
 614 
 615   CodeBlobToOopClosure adjust_from_blobs(adjust_pointer_closure(), CodeBlobToOopClosure::FixRelocations);
 616   CodeCache::blobs_do(&adjust_from_blobs);
 617   AOTLoader::oops_do(adjust_pointer_closure());
 618   StringTable::oops_do(adjust_pointer_closure());
 619   ref_processor()->weak_oops_do(adjust_pointer_closure());
 620   PSScavenge::reference_processor()->weak_oops_do(adjust_pointer_closure());
 621 
 622   adjust_marks();
 623 
 624   young_gen->adjust_pointers();




  33 #include "gc/parallel/psMarkSweep.hpp"
  34 #include "gc/parallel/psMarkSweepDecorator.hpp"
  35 #include "gc/parallel/psOldGen.hpp"
  36 #include "gc/parallel/psScavenge.hpp"
  37 #include "gc/parallel/psYoungGen.hpp"
  38 #include "gc/serial/markSweep.hpp"
  39 #include "gc/shared/gcCause.hpp"
  40 #include "gc/shared/gcHeapSummary.hpp"
  41 #include "gc/shared/gcId.hpp"
  42 #include "gc/shared/gcLocker.inline.hpp"
  43 #include "gc/shared/gcTimer.hpp"
  44 #include "gc/shared/gcTrace.hpp"
  45 #include "gc/shared/gcTraceTime.inline.hpp"
  46 #include "gc/shared/isGCActiveMark.hpp"
  47 #include "gc/shared/referencePolicy.hpp"
  48 #include "gc/shared/referenceProcessor.hpp"
  49 #include "gc/shared/spaceDecorator.hpp"
  50 #include "logging/log.hpp"
  51 #include "oops/oop.inline.hpp"
  52 #include "runtime/biasedLocking.hpp"

  53 #include "runtime/safepoint.hpp"
  54 #include "runtime/vmThread.hpp"
  55 #include "services/management.hpp"
  56 #include "services/memoryService.hpp"
  57 #include "utilities/align.hpp"
  58 #include "utilities/events.hpp"
  59 #include "utilities/stack.inline.hpp"
  60 
  61 elapsedTimer        PSMarkSweep::_accumulated_time;
  62 jlong               PSMarkSweep::_time_of_last_gc   = 0;
  63 CollectorCounters*  PSMarkSweep::_counters = NULL;
  64 
  65 void PSMarkSweep::initialize() {
  66   MemRegion mr = ParallelScavengeHeap::heap()->reserved_region();
  67   set_ref_processor(new ReferenceProcessor(mr));     // a vanilla ref proc
  68   _counters = new CollectorCounters("PSMarkSweep", 1);
  69 }
  70 
  71 // This method contains all heap specific policy for invoking mark sweep.
  72 // PSMarkSweep::invoke_no_policy() will only attempt to mark-sweep-compact


 492   _objarray_stack.clear(true);
 493 }
 494 
 495 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
 496   // Recursively traverse all live objects and mark them
 497   GCTraceTime(Info, gc, phases) tm("Phase 1: Mark live objects", _gc_timer);
 498 
 499   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
 500 
 501   // Need to clear claim bits before the tracing starts.
 502   ClassLoaderDataGraph::clear_claimed_marks();
 503 
 504   // General strong roots.
 505   {
 506     ParallelScavengeHeap::ParStrongRootsScope psrs;
 507     Universe::oops_do(mark_and_push_closure());
 508     JNIHandles::oops_do(mark_and_push_closure());   // Global (strong) JNI handles
 509     MarkingCodeBlobClosure each_active_code_blob(mark_and_push_closure(), !CodeBlobToOopClosure::FixRelocations);
 510     Threads::oops_do(mark_and_push_closure(), &each_active_code_blob);
 511     ObjectSynchronizer::oops_do(mark_and_push_closure());

 512     Management::oops_do(mark_and_push_closure());
 513     JvmtiExport::oops_do(mark_and_push_closure());
 514     SystemDictionary::always_strong_oops_do(mark_and_push_closure());
 515     ClassLoaderDataGraph::always_strong_cld_do(follow_cld_closure());
 516     // Do not treat nmethods as strong roots for mark/sweep, since we can unload them.
 517     //CodeCache::scavenge_root_nmethods_do(CodeBlobToOopClosure(mark_and_push_closure()));
 518     AOTLoader::oops_do(mark_and_push_closure());
 519   }
 520 
 521   // Flush marking stack.
 522   follow_stack();
 523 
 524   // Process reference objects found during marking
 525   {
 526     GCTraceTime(Debug, gc, phases) t("Reference Processing", _gc_timer);
 527 
 528     ref_processor()->setup_policy(clear_all_softrefs);
 529     const ReferenceProcessorStats& stats =
 530       ref_processor()->process_discovered_references(
 531         is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL, _gc_timer);


 582   // This will also compact the young gen spaces.
 583   old_gen->precompact();
 584 }
 585 
 586 void PSMarkSweep::mark_sweep_phase3() {
 587   // Adjust the pointers to reflect the new locations
 588   GCTraceTime(Info, gc, phases) tm("Phase 3: Adjust pointers", _gc_timer);
 589 
 590   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
 591   PSYoungGen* young_gen = heap->young_gen();
 592   PSOldGen* old_gen = heap->old_gen();
 593 
 594   // Need to clear claim bits before the tracing starts.
 595   ClassLoaderDataGraph::clear_claimed_marks();
 596 
 597   // General strong roots.
 598   Universe::oops_do(adjust_pointer_closure());
 599   JNIHandles::oops_do(adjust_pointer_closure());   // Global (strong) JNI handles
 600   Threads::oops_do(adjust_pointer_closure(), NULL);
 601   ObjectSynchronizer::oops_do(adjust_pointer_closure());

 602   Management::oops_do(adjust_pointer_closure());
 603   JvmtiExport::oops_do(adjust_pointer_closure());
 604   SystemDictionary::oops_do(adjust_pointer_closure());
 605   ClassLoaderDataGraph::cld_do(adjust_cld_closure());
 606 
 607   // Now adjust pointers in remaining weak roots.  (All of which should
 608   // have been cleared if they pointed to non-surviving objects.)
 609   // Global (weak) JNI handles
 610   JNIHandles::weak_oops_do(adjust_pointer_closure());
 611 
 612   CodeBlobToOopClosure adjust_from_blobs(adjust_pointer_closure(), CodeBlobToOopClosure::FixRelocations);
 613   CodeCache::blobs_do(&adjust_from_blobs);
 614   AOTLoader::oops_do(adjust_pointer_closure());
 615   StringTable::oops_do(adjust_pointer_closure());
 616   ref_processor()->weak_oops_do(adjust_pointer_closure());
 617   PSScavenge::reference_processor()->weak_oops_do(adjust_pointer_closure());
 618 
 619   adjust_marks();
 620 
 621   young_gen->adjust_pointers();


src/share/vm/gc/parallel/psMarkSweep.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File