< 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 >