diff --git a/src/test/java/testkits/GarbageCreator.java b/src/test/java/testkits/GarbageCreator.java index f88273b1..f76e458d 100644 --- a/src/test/java/testkits/GarbageCreator.java +++ b/src/test/java/testkits/GarbageCreator.java @@ -15,6 +15,7 @@ */ package testkits; +import java.lang.invoke.VarHandle; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.lang.ref.PhantomReference; @@ -78,6 +79,19 @@ public static void awaitReferenceProcessing() throws InterruptedException { } private static PhantomReference createLeakedObjectReference(ReferenceQueue queue) { - return new PhantomReference<>(new Object() /* intentionally leak */, queue); + return createLeakedObjectReference(queue, 10.0, 50.0); + } + + private static PhantomReference createLeakedObjectReference( + ReferenceQueue queue, double threshold, double current) { + if (threshold > 20.0 * (current + ThreadLocalRandom.current().nextDouble())) { + Object object = new Object(); + PhantomReference reference = new PhantomReference<>(object, queue); + VarHandle.fullFence(); + object = null; // intentionally leak + VarHandle.fullFence(); + return reference; + } + return createLeakedObjectReference(queue, threshold, current - 1.0); } }