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) {


Reply via email to