--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Wed Nov 13 14:08:04 2019 -0800
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Wed Nov 13 18:00:30 2019 -0500
@@ -133,6 +133,7 @@
friend class VM_CollectForMetadataAllocation;
friend class VM_G1CollectForAllocation;
friend class VM_G1CollectFull;
+ friend class VM_G1TryInitiateConcMark;
friend class VMStructs;
friend class MutatorAllocRegion;
friend class G1FullCollector;
@@ -259,16 +260,22 @@
G1HRPrinter _hr_printer;
- // It decides whether an explicit GC should start a concurrent cycle
- // instead of doing a STW GC. Currently, a concurrent cycle is
- // explicitly started if:
- // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or
- // (b) cause == _g1_humongous_allocation
- // (c) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent.
- // (d) cause == _dcmd_gc_run and +ExplicitGCInvokesConcurrent.
- // (e) cause == _wb_conc_mark
+ // Return true if an explicit GC should start a concurrent cycle instead
+ // of doing a STW full GC. A concurrent cycle should be started if:
+ // (a) cause == _gc_locker and +GCLockerInvokesConcurrent,
+ // (b) cause == _g1_humongous_allocation,
+ // (c) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent,
+ // (d) cause == _dcmd_gc_run and +ExplicitGCInvokesConcurrent,
+ // (e) cause == _wb_conc_mark,
+ // (f) cause == _g1_periodic_collection and +G1PeriodicGCInvokesConcurrent.
bool should_do_concurrent_full_gc(GCCause::Cause cause);
+ // Attempt to start a concurrent cycle with the indicated cause.
+ // precondition: should_do_concurrent_full_gc(cause)
+ bool try_collect_concurrently(GCCause::Cause cause,
+ uint gc_counter,
+ uint old_marking_started_before);
+
// Return true if should upgrade to full gc after an incremental one.
bool should_upgrade_to_full_gc(GCCause::Cause cause);
@@ -630,7 +637,7 @@
// Full GC). If concurrent is true, the caller is the outer caller
// in this nesting (i.e., the concurrent cycle). Further nesting is
// not currently supported. The end of this call also notifies
- // the FullGCCount_lock in case a Java thread is waiting for a full
+ // the G1OldGCCount_lock in case a Java thread is waiting for a full
// GC to happen (e.g., it called System.gc() with
// +ExplicitGCInvokesConcurrent).
void increment_old_marking_cycles_completed(bool concurrent);
@@ -1088,10 +1095,9 @@
// "CollectedHeap" supports.
virtual void collect(GCCause::Cause cause);
- // Perform a collection of the heap with the given cause; if the VM operation
- // fails to execute for any reason, retry only if retry_on_gc_failure is set.
+ // Perform a collection of the heap with the given cause.
// Returns whether this collection actually executed.
- bool try_collect(GCCause::Cause cause, bool retry_on_gc_failure);
+ bool try_collect(GCCause::Cause cause);
// True iff an evacuation has failed in the most-recent collection.
bool evacuation_failed() { return _evacuation_failed; }