8038265: CMS: enable time based triggering of concurrent cycles
Reviewed-by: mgerdin, brutisso
Contributed-by: michal@frajt.eu
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Apr 23 10:12:34 2014 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Apr 23 12:37:36 2014 +0200
@@ -1512,6 +1512,8 @@
gclog_or_tty->print_cr("cms_allocation_rate=%g", stats().cms_allocation_rate());
gclog_or_tty->print_cr("occupancy=%3.7f", _cmsGen->occupancy());
gclog_or_tty->print_cr("initiatingOccupancy=%3.7f", _cmsGen->initiating_occupancy());
+ gclog_or_tty->print_cr("cms_time_since_begin=%3.7f", stats().cms_time_since_begin());
+ gclog_or_tty->print_cr("cms_time_since_end=%3.7f", stats().cms_time_since_end());
gclog_or_tty->print_cr("metadata initialized %d",
MetaspaceGC::should_concurrent_collect());
}
@@ -1574,6 +1576,28 @@
return true;
}
+ // CMSTriggerInterval starts a CMS cycle if enough time has passed.
+ if (CMSTriggerInterval >= 0) {
+ if (CMSTriggerInterval == 0) {
+ // Trigger always
+ return true;
+ }
+
+ // Check the CMS time since begin (we do not check the stats validity
+ // as we want to be able to trigger the first CMS cycle as well)
+ if (stats().cms_time_since_begin() >= (CMSTriggerInterval / ((double) MILLIUNITS))) {
+ if (Verbose && PrintGCDetails) {
+ if (stats().valid()) {
+ gclog_or_tty->print_cr("CMSCollector: collect because of trigger interval (time since last begin %3.7f secs)",
+ stats().cms_time_since_begin());
+ } else {
+ gclog_or_tty->print_cr("CMSCollector: collect because of trigger interval (first collection)");
+ }
+ }
+ return true;
+ }
+ }
+
return false;
}
--- a/hotspot/src/share/vm/runtime/globals.hpp Wed Apr 23 10:12:34 2014 +0200
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Apr 23 12:37:36 2014 +0200
@@ -1931,6 +1931,10 @@
"not just one of the generations (e.g., G1). A value of 0 " \
"denotes 'do constant GC cycles'.") \
\
+ manageable(intx, CMSTriggerInterval, -1, \
+ "Commence a CMS collection cycle (at least) every so many " \
+ "milliseconds (0 permanently, -1 disabled)") \
+ \
product(bool, UseCMSInitiatingOccupancyOnly, false, \
"Only use occupancy as a criterion for starting a CMS collection")\
\