< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
Print this page
rev 55538 : 8226757: Shenandoah: Make Traversal a separate mode
*** 66,75 ****
--- 66,77 ----
}
void ShenandoahControlThread::run_service() {
ShenandoahHeap* heap = ShenandoahHeap::heap();
+ GCMode default_mode = heap->is_traversal_mode() ? concurrent_traversal : concurrent_normal;
+ GCCause::Cause default_cause = default_mode == concurrent_traversal ? GCCause::_shenandoah_traversal_gc : GCCause::_shenandoah_concurrent_gc;
int sleep = ShenandoahControlIntervalMin;
double last_shrink_time = os::elapsedTime();
double last_sleep_adjust_time = os::elapsedTime();
*** 121,135 ****
heuristics->record_requested_gc();
if (ExplicitGCInvokesConcurrent) {
policy->record_explicit_to_concurrent();
! if (heuristics->can_do_traversal_gc()) {
! mode = concurrent_traversal;
! } else {
! mode = concurrent_normal;
! }
// Unload and clean up everything
heap->set_process_references(heuristics->can_process_references());
heap->set_unload_classes(heuristics->can_unload_classes());
} else {
policy->record_explicit_to_full();
--- 123,133 ----
heuristics->record_requested_gc();
if (ExplicitGCInvokesConcurrent) {
policy->record_explicit_to_concurrent();
! mode = default_mode;
// Unload and clean up everything
heap->set_process_references(heuristics->can_process_references());
heap->set_unload_classes(heuristics->can_unload_classes());
} else {
policy->record_explicit_to_full();
*** 141,171 ****
heuristics->record_requested_gc();
if (ShenandoahImplicitGCInvokesConcurrent) {
policy->record_implicit_to_concurrent();
! if (heuristics->can_do_traversal_gc()) {
! mode = concurrent_traversal;
! } else {
! mode = concurrent_normal;
! }
// Unload and clean up everything
heap->set_process_references(heuristics->can_process_references());
heap->set_unload_classes(heuristics->can_unload_classes());
} else {
policy->record_implicit_to_full();
mode = stw_full;
}
} else {
// Potential normal cycle: ask heuristics if it wants to act
! if (heuristics->should_start_traversal_gc()) {
! mode = concurrent_traversal;
! cause = GCCause::_shenandoah_traversal_gc;
! } else if (heuristics->should_start_normal_gc()) {
! mode = concurrent_normal;
! cause = GCCause::_shenandoah_concurrent_gc;
}
// Ask policy if this cycle wants to process references or unload classes
heap->set_process_references(heuristics->should_process_references());
heap->set_unload_classes(heuristics->should_unload_classes());
--- 139,162 ----
heuristics->record_requested_gc();
if (ShenandoahImplicitGCInvokesConcurrent) {
policy->record_implicit_to_concurrent();
! mode = default_mode;
// Unload and clean up everything
heap->set_process_references(heuristics->can_process_references());
heap->set_unload_classes(heuristics->can_unload_classes());
} else {
policy->record_implicit_to_full();
mode = stw_full;
}
} else {
// Potential normal cycle: ask heuristics if it wants to act
! if (heuristics->should_start_gc()) {
! mode = default_mode;
! cause = default_cause;
}
// Ask policy if this cycle wants to process references or unload classes
heap->set_process_references(heuristics->should_process_references());
heap->set_unload_classes(heuristics->should_unload_classes());
< prev index next >