# HG changeset patch # User rehn # Date 1497430235 -7200 # Wed Jun 14 10:50:35 2017 +0200 # Node ID db4478061d2be10a2ea086032048498148b67242 # Parent 1af241d802de1e55debef2b8d530f5682f885e42 imported patch deflation diff --git a/src/share/vm/runtime/globals.hpp b/src/share/vm/runtime/globals.hpp --- a/src/share/vm/runtime/globals.hpp +++ b/src/share/vm/runtime/globals.hpp @@ -1184,6 +1184,12 @@ \ product(bool, MonitorInUseLists, true, "Track Monitors for Deflation") \ \ + experimental(intx, MonitorUsedDeflationThreshold, 90, \ + "Percentage of used monitors before trigger cleanup " \ + "safepoint which deflates monitors (0 is off)" \ + "The check is performed on GuaranteedSafepointInterval") \ + range(0, 100) \ + \ experimental(intx, SyncFlags, 0, "(Unsafe, Unstable) " \ "Experimental Sync flags") \ \ diff --git a/src/share/vm/runtime/safepoint.cpp b/src/share/vm/runtime/safepoint.cpp --- a/src/share/vm/runtime/safepoint.cpp +++ b/src/share/vm/runtime/safepoint.cpp @@ -525,6 +525,8 @@ } bool SafepointSynchronize::is_cleanup_needed() { + // Need a safepoint if there many monitor to deflate + if (ObjectSynchronizer::is_cleanup_needed()) return true; // Need a safepoint if some inline cache buffers is non-empty if (!InlineCacheBuffer::is_empty()) return true; return false; diff --git a/src/share/vm/runtime/synchronizer.cpp b/src/share/vm/runtime/synchronizer.cpp --- a/src/share/vm/runtime/synchronizer.cpp +++ b/src/share/vm/runtime/synchronizer.cpp @@ -962,6 +962,10 @@ return block; } +bool ObjectSynchronizer::is_cleanup_needed() { + int monitors_used = gMonitorPopulation - gMonitorFreeCount; + return MonitorUsedDeflationThreshold > 0 ? (monitors_used*100)/gMonitorPopulation > MonitorUsedDeflationThreshold : false; +} void ObjectSynchronizer::oops_do(OopClosure* f) { if (MonitorInUseLists) { diff --git a/src/share/vm/runtime/synchronizer.hpp b/src/share/vm/runtime/synchronizer.hpp --- a/src/share/vm/runtime/synchronizer.hpp +++ b/src/share/vm/runtime/synchronizer.hpp @@ -145,6 +145,8 @@ int *error_cnt_ptr, int *warning_cnt_ptr); static int verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0; + static bool is_cleanup_needed(); + private: enum { _BLOCKSIZE = 128 }; // global list of blocks of monitors # HG changeset patch # User rehn # Date 1497430238 -7200 # Wed Jun 14 10:50:38 2017 +0200 # Node ID a8307b3c3cf41e38b48a77c94354991231336997 # Parent db4478061d2be10a2ea086032048498148b67242 imported patch deflation_2 diff --git a/src/share/vm/runtime/synchronizer.cpp b/src/share/vm/runtime/synchronizer.cpp --- a/src/share/vm/runtime/synchronizer.cpp +++ b/src/share/vm/runtime/synchronizer.cpp @@ -964,7 +964,7 @@ bool ObjectSynchronizer::is_cleanup_needed() { int monitors_used = gMonitorPopulation - gMonitorFreeCount; - return MonitorUsedDeflationThreshold > 0 ? (monitors_used*100)/gMonitorPopulation > MonitorUsedDeflationThreshold : false; + return MonitorUsedDeflationThreshold > 0 && (monitors_used * 100LL) / gMonitorPopulation > MonitorUsedDeflationThreshold; } void ObjectSynchronizer::oops_do(OopClosure* f) { # HG changeset patch # User rehn # Date 1497432833 -7200 # Wed Jun 14 11:33:53 2017 +0200 # Node ID 85917bdfa617e75add9604251d4dc5a76967cf29 # Parent a8307b3c3cf41e38b48a77c94354991231336997 [mq]: deflation_3 diff --git a/src/share/vm/runtime/synchronizer.cpp b/src/share/vm/runtime/synchronizer.cpp --- a/src/share/vm/runtime/synchronizer.cpp +++ b/src/share/vm/runtime/synchronizer.cpp @@ -962,9 +962,17 @@ return block; } +static bool monitors_used_above_threshold() { + int monitors_used = gMonitorPopulation - gMonitorFreeCount; + int monitor_useage = (monitors_used * 100LL) / gMonitorPopulation; + return monitor_useage > MonitorUsedDeflationThreshold; +} + bool ObjectSynchronizer::is_cleanup_needed() { - int monitors_used = gMonitorPopulation - gMonitorFreeCount; - return MonitorUsedDeflationThreshold > 0 && (monitors_used * 100LL) / gMonitorPopulation > MonitorUsedDeflationThreshold; + if (MonitorUsedDeflationThreshold > 0) { + return monitors_used_above_threshold(); + } + return false; } void ObjectSynchronizer::oops_do(OopClosure* f) {