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);
}
}
Source
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