Author: alexparvulescu Date: Wed Nov 16 16:22:33 2016 New Revision: 1770010
URL: http://svn.apache.org/viewvc?rev=1770010&view=rev Log: OAK-5117 Improve checkMemory for compaction - based on patch provided by Valentin Olteanu Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMemoryBarrier.java Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMemoryBarrier.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMemoryBarrier.java?rev=1770010&r1=1770009&r2=1770010&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMemoryBarrier.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMemoryBarrier.java Wed Nov 16 16:22:33 2016 @@ -85,11 +85,12 @@ public class GCMemoryBarrier implements emitter = (NotificationEmitter) getMemoryMXBean(); listener = new MemoryListener(); emitter.addNotificationListener(listener, null, null); - long maxMemory = pool.getUsage().getMax(); + MemoryUsage usage = pool.getCollectionUsage(); + long maxMemory = usage.getMax(); long required = (long) (maxMemory * percentage / 100); gcListener - .info("TarMK GC #{}: setting up a listener to cancel compaction if available memory drops below {}%, {} ({} bytes).", - gcCount, percentage, + .info("TarMK GC #{}: setting up a listener to cancel compaction if available memory on pool '{}' drops below {}%, {} ({} bytes).", + gcCount, pool.getName(), percentage, humanReadableByteCount(required), required); long warningThreshold = maxMemory - required; @@ -98,7 +99,7 @@ public class GCMemoryBarrier implements warningThreshold = Math.min(warningThreshold, current); } pool.setCollectionUsageThreshold(warningThreshold); - checkMemory(pool.getUsage()); + checkMemory(usage); } else { emitter = null; listener = null; @@ -107,13 +108,20 @@ public class GCMemoryBarrier implements } private static MemoryPoolMXBean getMemoryPool() { + long maxSize = 0; + MemoryPoolMXBean maxPool = null; for (MemoryPoolMXBean pool : getMemoryPoolMXBeans()) { if (HEAP == pool.getType() && pool.isCollectionUsageThresholdSupported()) { - return pool; + // Get usage after a GC, which is more stable, if available + long poolSize = pool.getCollectionUsage().getMax(); + // Keep the pool with biggest size, by default it should be Old Gen Space + if (poolSize > maxSize) { + maxPool = pool; + } } } - return null; + return maxPool; } private void checkMemory(MemoryUsage usage) {
