All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.netty.buffer.AdaptiveByteBufAllocator Maven / Gradle / Ivy

Go to download

This artifact provides a single jar that contains all classes required to use remote EJB and JMS, including all dependencies. It is intended for use by those not using maven, maven users should just import the EJB and JMS BOM's instead (shaded JAR's cause lots of problems with maven, as it is very easy to inadvertently end up with different versions on classes on the class path).

There is a newer version: 34.0.0.Final
Show newest version
/*
 * Copyright 2024 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package io.netty.buffer;

import io.netty.buffer.AdaptivePoolingAllocator.MagazineCaching;
import io.netty.util.internal.PlatformDependent;
import io.netty.util.internal.SystemPropertyUtil;
import io.netty.util.internal.UnstableApi;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;

import static io.netty.util.internal.PlatformDependent.javaVersion;

/**
 * An auto-tuning pooling {@link ByteBufAllocator}, that follows an anti-generational hypothesis.
 * 

* Note: this allocator is experimental. It is recommended to roll out usage slowly, * and to carefully monitor application performance in the process. *

* See the {@link AdaptivePoolingAllocator} class documentation for implementation details. */ @UnstableApi public final class AdaptiveByteBufAllocator extends AbstractByteBufAllocator implements ByteBufAllocatorMetricProvider, ByteBufAllocatorMetric { private static final InternalLogger logger = InternalLoggerFactory.getInstance(AdaptiveByteBufAllocator.class); private static final boolean DEFAULT_USE_CACHED_MAGAZINES_FOR_NON_EVENT_LOOP_THREADS; static { DEFAULT_USE_CACHED_MAGAZINES_FOR_NON_EVENT_LOOP_THREADS = SystemPropertyUtil.getBoolean( "io.netty.allocator.useCachedMagazinesForNonEventLoopThreads", false); logger.debug("-Dio.netty.allocator.useCachedMagazinesForNonEventLoopThreads: {}", DEFAULT_USE_CACHED_MAGAZINES_FOR_NON_EVENT_LOOP_THREADS); } private final AdaptiveAllocatorApi direct; private final AdaptiveAllocatorApi heap; public AdaptiveByteBufAllocator() { this(PlatformDependent.directBufferPreferred()); } public AdaptiveByteBufAllocator(boolean preferDirect) { this(preferDirect, DEFAULT_USE_CACHED_MAGAZINES_FOR_NON_EVENT_LOOP_THREADS); } public AdaptiveByteBufAllocator(boolean preferDirect, boolean useCacheForNonEventLoopThreads) { super(preferDirect); if (javaVersion() < 8) { // The implementation uses StampedLock, which was introduced in Java 8. throw new IllegalStateException("This allocator require Java 8 or newer."); } MagazineCaching magazineCaching = useCacheForNonEventLoopThreads? MagazineCaching.FastThreadLocalThreads : MagazineCaching.EventLoopThreads; direct = new AdaptivePoolingAllocator(new DirectChunkAllocator(this), magazineCaching); heap = new AdaptivePoolingAllocator(new HeapChunkAllocator(this), magazineCaching); } @Override protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity) { return heap.allocate(initialCapacity, maxCapacity); } @Override protected ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity) { return direct.allocate(initialCapacity, maxCapacity); } @Override public boolean isDirectBufferPooled() { return true; } @Override public long usedHeapMemory() { return heap.usedMemory(); } @Override public long usedDirectMemory() { return direct.usedMemory(); } @Override public ByteBufAllocatorMetric metric() { return this; } interface AdaptiveAllocatorApi { ByteBuf allocate(int initialCapacity, int maxCapacity); long usedMemory(); } private static final class HeapChunkAllocator implements AdaptivePoolingAllocator.ChunkAllocator { private final ByteBufAllocator allocator; private HeapChunkAllocator(ByteBufAllocator allocator) { this.allocator = allocator; } @Override public ByteBuf allocate(int initialCapacity, int maxCapacity) { return PlatformDependent.hasUnsafe() ? new UnpooledUnsafeHeapByteBuf(allocator, initialCapacity, maxCapacity) : new UnpooledHeapByteBuf(allocator, initialCapacity, maxCapacity); } } private static final class DirectChunkAllocator implements AdaptivePoolingAllocator.ChunkAllocator { private final ByteBufAllocator allocator; private DirectChunkAllocator(ByteBufAllocator allocator) { this.allocator = allocator; } @Override public ByteBuf allocate(int initialCapacity, int maxCapacity) { return PlatformDependent.hasUnsafe() ? UnsafeByteBufUtil.newUnsafeDirectByteBuf(allocator, initialCapacity, maxCapacity) : new UnpooledDirectByteBuf(allocator, initialCapacity, maxCapacity); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy