diff --git a/src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java b/src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java index 8921014..1295c71 100644 --- a/src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java +++ b/src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java @@ -37,7 +37,7 @@ class ManagedBufferAllocator implements BufferAllocator, AllocatorControl { @Override public Object allocateUntethered(Buffer originator, int size) { BufferAllocator.checkSize(size); - var buf = manager.allocateShared(this, size, NO_OP_DROP, null); + var buf = manager.allocateShared(this, size, NO_OP_DROP, cleaner); return manager.unwrapRecoverableMemory(buf); } diff --git a/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java b/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java index 98fe021..78d1872 100644 --- a/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java +++ b/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java @@ -21,15 +21,35 @@ import jdk.incubator.foreign.ResourceScope; import java.lang.ref.Cleaner; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.LongAdder; +import java.util.function.Function; import static jdk.incubator.foreign.ResourceScope.newSharedScope; public class NativeMemorySegmentManager extends AbstractMemorySegmentManager { public static final LongAdder MEM_USAGE_NATIVE = new LongAdder(); private static final ConcurrentHashMap CLEANUP_ACTIONS = new ConcurrentHashMap<>(); + private static final Function CLEANUP_ACTION_MAKER = s -> new ReduceNativeMemoryUsage(s); static Runnable getCleanupAction(long size) { - return CLEANUP_ACTIONS.computeIfAbsent(size, s -> () -> MEM_USAGE_NATIVE.add(-s)); + return CLEANUP_ACTIONS.computeIfAbsent(size, CLEANUP_ACTION_MAKER); + } + + private static final class ReduceNativeMemoryUsage implements Runnable { + private final long size; + + private ReduceNativeMemoryUsage(long size) { + this.size = size; + } + + @Override + public void run() { + MEM_USAGE_NATIVE.add(-size); + } + + @Override + public String toString() { + return "ReduceNativeMemoryUsage(by " + size + " bytes)"; + } } @Override diff --git a/src/test/java/io/netty/buffer/api/BufferTest.java b/src/test/java/io/netty/buffer/api/BufferTest.java index e3ccdbf..ee4a591 100644 --- a/src/test/java/io/netty/buffer/api/BufferTest.java +++ b/src/test/java/io/netty/buffer/api/BufferTest.java @@ -1683,8 +1683,8 @@ public class BufferTest { for (int i = 0; i < iterations; i++) { allocateAndForget(allocator, allocationSize); System.gc(); - System.runFinalization(); } + System.runFinalization(); var sum = NativeMemorySegmentManager.MEM_USAGE_NATIVE.sum() - initial; var totalAllocated = (long) allocationSize * iterations; assertThat(sum).isLessThan(totalAllocated); @@ -1705,8 +1705,8 @@ public class BufferTest { for (int i = 0; i < iterations; i++) { allocateAndForget(allocator, allocationSize); System.gc(); - System.runFinalization(); } + System.runFinalization(); var sum = NativeMemorySegmentManager.MEM_USAGE_NATIVE.sum() - initial; var totalAllocated = (long) allocationSize * iterations; assertThat(sum).isLessThan(totalAllocated);