Home / Class/ HeapArena Class — netty Architecture

HeapArena Class — netty Architecture

Architecture documentation for the HeapArena class in PoolArena.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  5fe14aa6_3815_02ca_523d_4b66835a9f37["HeapArena"]
  22b08479_a3b8_e618_f86f_ad3544d470e6["PoolArena.java"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|defined in| 22b08479_a3b8_e618_f86f_ad3544d470e6
  78a199bb_0687_ecd9_1df1_41208e1d9fdc["HeapArena()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| 78a199bb_0687_ecd9_1df1_41208e1d9fdc
  fec3286e_794b_6a98_ec40_7f339829a8a9["newByteArray()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| fec3286e_794b_6a98_ec40_7f339829a8a9
  8fe4add9_6c43_cd35_8f74_9ebe3e7f9dde["isDirect()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| 8fe4add9_6c43_cd35_8f74_9ebe3e7f9dde
  5ebad7b9_a0bc_7869_6ae3_d7908e601666["newChunk()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| 5ebad7b9_a0bc_7869_6ae3_d7908e601666
  bf114ee3_86b6_505b_85bf_843274f28718["newUnpooledChunk()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| bf114ee3_86b6_505b_85bf_843274f28718
  462a2d41_bed9_993d_ec2c_42355333a7b8["destroyChunk()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| 462a2d41_bed9_993d_ec2c_42355333a7b8
  1d5acd1b_3766_a234_7ccb_465b1940ca4a["newByteBuf()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| 1d5acd1b_3766_a234_7ccb_465b1940ca4a
  38f79f3f_f8f5_d240_2c49_9eff810556fb["memoryCopy()"]
  5fe14aa6_3815_02ca_523d_4b66835a9f37 -->|method| 38f79f3f_f8f5_d240_2c49_9eff810556fb

Relationship Graph

Source Code

buffer/src/main/java/io/netty/buffer/PoolArena.java lines 662–721

    static final class HeapArena extends PoolArena<byte[]> {
        private final AtomicReference<PoolChunk<byte[]>> lastDestroyedChunk;

        HeapArena(PooledByteBufAllocator parent, SizeClasses sizeClass) {
            super(parent, sizeClass);
            lastDestroyedChunk = new AtomicReference<>();
        }

        private static byte[] newByteArray(int size) {
            return PlatformDependent.allocateUninitializedArray(size);
        }

        @Override
        boolean isDirect() {
            return false;
        }

        @Override
        protected PoolChunk<byte[]> newChunk(int pageSize, int maxPageIdx, int pageShifts, int chunkSize) {
            PoolChunk<byte[]> chunk = lastDestroyedChunk.getAndSet(null);
            if (chunk != null) {
                assert chunk.chunkSize == chunkSize &&
                        chunk.pageSize == pageSize &&
                        chunk.maxPageIdx == maxPageIdx &&
                        chunk.pageShifts == pageShifts;
                return chunk; // The parameters are always the same, so it's fine to reuse a previously allocated chunk.
            }
            return new PoolChunk<byte[]>(
                    this, null, null, newByteArray(chunkSize), pageSize, pageShifts, chunkSize, maxPageIdx);
        }

        @Override
        protected PoolChunk<byte[]> newUnpooledChunk(int capacity) {
            return new PoolChunk<byte[]>(this, null, null, newByteArray(capacity), capacity);
        }

        @Override
        protected void destroyChunk(PoolChunk<byte[]> chunk) {
            PooledByteBufAllocator.onDeallocateChunk(chunk, !chunk.unpooled);
            // Rely on GC. But keep one chunk for reuse.
            if (!chunk.unpooled && lastDestroyedChunk.get() == null) {
                lastDestroyedChunk.set(chunk); // The check-and-set does not need to be atomic.
            }
        }

        @Override
        protected PooledByteBuf<byte[]> newByteBuf(int maxCapacity) {
            return HAS_UNSAFE ? PooledUnsafeHeapByteBuf.newUnsafeInstance(maxCapacity)
                    : PooledHeapByteBuf.newInstance(maxCapacity);
        }

        @Override
        protected void memoryCopy(byte[] src, int srcOffset, PooledByteBuf<byte[]> dst, int length) {
            if (length == 0) {
                return;
            }

            System.arraycopy(src, srcOffset, dst.memory, dst.offset, length);
        }
    }

Frequently Asked Questions

What is the HeapArena class?
HeapArena is a class in the netty codebase, defined in buffer/src/main/java/io/netty/buffer/PoolArena.java.
Where is HeapArena defined?
HeapArena is defined in buffer/src/main/java/io/netty/buffer/PoolArena.java at line 662.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free