diff options
author | danielhanrahan <daniel.hanrahan@est.tech> | 2023-11-15 13:21:34 +0000 |
---|---|---|
committer | danielhanrahan <daniel.hanrahan@est.tech> | 2023-11-22 15:28:47 +0000 |
commit | c6dfb03f66eb4573c6fcea761e2414aadaaf7878 (patch) | |
tree | fbd947570136320e6908b13a3dcca46fe2388b30 /integration-test/src/test/java | |
parent | e1f12d7e903c6bb3071f2848c939ccb4afb939ba (diff) |
Make performance tests measure PEAK memory usage
Presently, performance tests measure CURRENT memory usage instead of
PEAK memory usage, leading to under-reporting if garbage collector
runs during a test. This patch fixes it, so that memory reported will
now be at least the memory of live objects at that time.
- Add tests for ResourceMeter class
- ResourceMeter measures peak memory usage instead of current
Issue-ID: CPS-1967
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
Change-Id: I36e9ea2196420b84877ecabc1b7331c5d3e2e252
Diffstat (limited to 'integration-test/src/test/java')
-rw-r--r-- | integration-test/src/test/java/org/onap/cps/integration/ResourceMeter.java | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/integration-test/src/test/java/org/onap/cps/integration/ResourceMeter.java b/integration-test/src/test/java/org/onap/cps/integration/ResourceMeter.java index c7d96c4c2b..f8a2ecb4df 100644 --- a/integration-test/src/test/java/org/onap/cps/integration/ResourceMeter.java +++ b/integration-test/src/test/java/org/onap/cps/integration/ResourceMeter.java @@ -20,6 +20,10 @@ 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); } } |