Make performance tests measure PEAK memory usage
[cps.git] / integration-test / src / test / java / org / onap / cps / integration / ResourceMeter.java
index c7d96c4..f8a2ecb 100644 (file)
 
 package org.onap.cps.integration;
 
+import java.lang.management.GarbageCollectorMXBean;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryPoolMXBean;
+import java.lang.management.MemoryType;
 import org.springframework.util.StopWatch;
 
 /**
@@ -34,8 +38,9 @@ public class ResourceMeter {
      * Start measurement.
      */
     public void start() {
-        System.gc();
-        memoryUsedBefore = getCurrentMemoryUsage();
+        performGcAndWait();
+        resetPeakHeapUsage();
+        memoryUsedBefore = getPeakHeapUsage();
         stopWatch.start();
     }
 
@@ -44,7 +49,7 @@ public class ResourceMeter {
      */
     public void stop() {
         stopWatch.stop();
-        memoryUsedAfter = getCurrentMemoryUsage();
+        memoryUsedAfter = getPeakHeapUsage();
     }
 
     /**
@@ -63,8 +68,30 @@ public class ResourceMeter {
         return (memoryUsedAfter - memoryUsedBefore) / 1_000_000.0;
     }
 
-    private static long getCurrentMemoryUsage() {
-        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
+    static void performGcAndWait() {
+        final long gcCountBefore = getGcCount();
+        System.gc();
+        while (getGcCount() == gcCountBefore) {}
+    }
+
+    private static long getGcCount() {
+        return ManagementFactory.getGarbageCollectorMXBeans().stream()
+                .mapToLong(GarbageCollectorMXBean::getCollectionCount)
+                .filter(gcCount -> gcCount != -1)
+                .sum();
+    }
+
+    private static long getPeakHeapUsage() {
+        return ManagementFactory.getMemoryPoolMXBeans().stream()
+                .filter(pool -> pool.getType() == MemoryType.HEAP)
+                .mapToLong(pool -> pool.getPeakUsage().getUsed())
+                .sum();
+    }
+
+    private static void resetPeakHeapUsage() {
+        ManagementFactory.getMemoryPoolMXBeans().stream()
+                .filter(pool -> pool.getType() == MemoryType.HEAP)
+                .forEach(MemoryPoolMXBean::resetPeakUsage);
     }
 }