< prev index next >

src/share/vm/gc_implementation/shenandoah/shenandoahControlThread.cpp

Print this page
rev 11461 : [backport] 8226757: Shenandoah: Make traversal and passive modes explicit
rev 11463 : Backport Traversal GC

*** 31,40 **** --- 31,41 ---- #include "gc_implementation/shenandoah/shenandoahFreeSet.hpp" #include "gc_implementation/shenandoah/shenandoahHeap.inline.hpp" #include "gc_implementation/shenandoah/shenandoahHeuristics.hpp" #include "gc_implementation/shenandoah/shenandoahMonitoringSupport.hpp" #include "gc_implementation/shenandoah/shenandoahPhaseTimings.hpp" + #include "gc_implementation/shenandoah/shenandoahTraversalGC.hpp" #include "gc_implementation/shenandoah/shenandoahUtils.hpp" #include "gc_implementation/shenandoah/shenandoahVMOperations.hpp" #include "gc_implementation/shenandoah/shenandoahWorkerPolicy.hpp" #include "memory/iterator.hpp" #include "memory/universe.hpp"
*** 97,108 **** } } ShenandoahHeap* heap = ShenandoahHeap::heap(); ! GCMode default_mode = concurrent_normal; ! GCCause::Cause default_cause = GCCause::_shenandoah_concurrent_gc; int sleep = ShenandoahControlIntervalMin; double last_shrink_time = os::elapsedTime(); double last_sleep_adjust_time = os::elapsedTime(); --- 98,111 ---- } } ShenandoahHeap* heap = ShenandoahHeap::heap(); ! GCMode default_mode = heap->is_traversal_mode() ? ! concurrent_traversal : concurrent_normal; ! GCCause::Cause default_cause = heap->is_traversal_mode() ? ! GCCause::_shenandoah_traversal_gc : GCCause::_shenandoah_concurrent_gc; int sleep = ShenandoahControlIntervalMin; double last_shrink_time = os::elapsedTime(); double last_sleep_adjust_time = os::elapsedTime();
*** 218,227 **** --- 221,233 ---- } switch (mode) { case none: break; + case concurrent_traversal: + service_concurrent_traversal_cycle(cause); + break; case concurrent_normal: service_concurrent_normal_cycle(cause); break; case stw_degenerated: service_stw_degenerated_cycle(cause, degen_point);
*** 309,318 **** --- 315,348 ---- os::naked_short_sleep(ShenandoahControlIntervalMin); } terminate(); } + void ShenandoahControlThread::service_concurrent_traversal_cycle(GCCause::Cause cause) { + ShenandoahGCSession session(cause); + + ShenandoahHeap* heap = ShenandoahHeap::heap(); + TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters()); + + // Reset for upcoming cycle + heap->entry_reset(); + + heap->vmop_entry_init_traversal(); + + if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_traversal)) return; + + heap->entry_traversal(); + if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_traversal)) return; + + heap->vmop_entry_final_traversal(); + + heap->entry_cleanup(); + + heap->heuristics()->record_success_concurrent(); + heap->shenandoah_policy()->record_success_concurrent(); + } + void ShenandoahControlThread::service_concurrent_normal_cycle(GCCause::Cause cause) { // Normal cycle goes via all concurrent phases. If allocation failure (af) happens during // any of the concurrent phases, it first degrades to Degenerated GC and completes GC there. // If second allocation failure happens during Degenerated GC cycle (for example, when GC // tries to evac something and no memory is available), cycle degrades to Full GC.
< prev index next >