diff --git a/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java b/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java index 48f02daf72d..a264030d366 100644 --- a/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java +++ b/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java @@ -19,12 +19,15 @@ public abstract class VertxByteBufAllocator extends AbstractByteBufAllocator { + private static final boolean REUSE_NETTY_ALLOCATOR = Boolean.getBoolean("vertx.reuseNettyAllocators"); + /** - * Vert.x pooled allocator. + * Vert.x pooled allocator. It should prefers direct buffers, unless {@link PlatformDependent#hasUnsafe()} is {@code false}. */ - public static final ByteBufAllocator POOLED_ALLOCATOR = new PooledByteBufAllocator(true); + public static final ByteBufAllocator POOLED_ALLOCATOR = (REUSE_NETTY_ALLOCATOR && PooledByteBufAllocator.defaultPreferDirect()) ? + PooledByteBufAllocator.DEFAULT : new PooledByteBufAllocator(true); /** - * Vert.x shared unpooled allocator. + * Vert.x shared unpooled allocator. It prefers non-direct buffers. */ public static final ByteBufAllocator UNPOOLED_ALLOCATOR = new UnpooledByteBufAllocator(false); @@ -42,6 +45,10 @@ protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity) { } }; + /** + * Vert.x shared unpooled heap buffers allocator.
+ * Differently from {@link #UNPOOLED_ALLOCATOR}, its buffers are not reference-counted and array-backed. + */ public static final VertxByteBufAllocator DEFAULT = PlatformDependent.hasUnsafe() ? UNSAFE_IMPL : IMPL; @Override diff --git a/src/test/java/io/vertx/core/buffer/impl/VertxByteBufAllocatorTest.java b/src/test/java/io/vertx/core/buffer/impl/VertxByteBufAllocatorTest.java new file mode 100644 index 00000000000..c23c1a28433 --- /dev/null +++ b/src/test/java/io/vertx/core/buffer/impl/VertxByteBufAllocatorTest.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011-2024 Contributors to the Eclipse Foundation + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + */ + +package io.vertx.core.buffer.impl; + +import org.junit.Assert; +import org.junit.Test; + +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.PooledByteBufAllocator; + +public class VertxByteBufAllocatorTest { + + + @Test + public void defaultShouldNotReuseExistingNettyPooledAllocators() { + Assert.assertNull(System.getProperty("vertx.reuseNettyAllocators")); + Assert.assertNotSame(PooledByteBufAllocator.DEFAULT, VertxByteBufAllocator.POOLED_ALLOCATOR); + Assert.assertNotSame(ByteBufAllocator.DEFAULT, VertxByteBufAllocator.POOLED_ALLOCATOR); + Assert.assertSame(ByteBufAllocator.DEFAULT, PooledByteBufAllocator.DEFAULT); + } + +}