Netty源码分析(八)—内存池分析

本文详细介绍了Netty内存池的设计,包括内存数据结构、内存池的入口PoolByteBufAllocator、内存块PoolArena以及分配基本单元PoolChunk。Netty内存池采用Slab和Buddy分配思想,减少内存碎片和浪费。内存池分为Arena、ChunkList、Chunk、Page、SubPage五级,通过PoolByteBufAllocator进行内存分配,使用PoolArena缓解高并发下的线程竞争,提高内存分配效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Netty源码分析(八)—内存池分析

Netty内存池是将内存的分配管理起来减少内存碎片和避免内存浪费,Netty内存池参考了Slab分配和Buddy分配思想;Slab分配是将内存分割成大小不等的内存块,在用户线程请求时根据请求的内存大小分配最为贴近size的内存快,减少了内存碎片同时避免了内存浪费;Buddy分配是把一块内存块等量分割,回收时候进行合并,尽可能保证系统中有足够大的连续内存;

个人主页:tuzhenyu’s page
原文地址:Netty源码分析(八)—内存池分析

(0) 内存数据结构

  • 内存分级从上到下主要分为:Arena,ChunkList,Chunk,Page,SubPage五级;

这里写图片描述

  • PooledArena是一块连续的内存块,为了优化并发性能在Netty内存池中存在一个由多个Arena组成的数组,在多个线程进行内存分配时会按照轮询策略选择一个Arena进行内存分配;

    • 一个PoolArena内存块是由两个SubPagePools(用来存储零碎内存)和多个ChunkList组成,两个SubpagePools数组分别为tinySubpagePools和smallSubpagePools。每个ChunkList里包含多个Chunk按照双向链表排列,每个Chunk里包含多个Page(默认2048个),每个Page(默认大小为8k字节)由多个Subpage组成。

    • 每个ChunkList里包含的Chunk数量会动态变化,比如当该chunk的内存利用率变化时会向其它ChunkList里移动。


final PooledByteBufAllocator parent;

private final int maxOrder;
final int pageSize;
final int pageShifts;
final int chunkSize;
final int subpageOverflowMask;
final int numSmallSubpagePools;
final int directMemoryCacheAlignment;
final int directMemoryCacheAlignmentMask;

private final PoolSubpage<T>[] tinySubpagePools;
private final PoolSubpage<T>[] smallSubpagePools;

private final PoolChunkList<T> q050;
private final PoolChunkList<T> q025;
private final PoolChunkList<T> q000;
private final PoolChunkList<T> qInit;
private final PoolChunkList<T> q075;
private final PoolChunkList<T> q100;
  • 内存池内存分配规则

    • 对于小于PageSize大小的内存分配,会在tinySubPagePools和smallSubPagePools中分配,tinySubPagePools用来分配小于512字节的内存,smallSubPagePools用来分配大于512字节小于PageSize的内存;

    • 对于大于PageSize小于ChunkSize的内存分配,会在PoolChunkList中的Chunk中分配

    • 对于大于ChunkSize的内存分配,会之间直接创建非池化的Chunk来分配,并且该Chunk不会放在内存池中重用。

(1) 内存池的入口PoolByteBufAllocator

  • 内存池进行内存分配是通过PooledByteBufAllocator类的buffer()方法实现的

p
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值