内存管理
Netty的内存管理有两部分要点:自适应内存大小算法和真实的内存管理:
再讲之前我们再来看看数据读取的过程:
1 | public final void read() { |
可以看到两个在内存分配管理上比较重要的Allocator
、AllocHandle
。
Allocator 是用来分配内存的,而AllocHandle则是用来辅助分配内存的,决定在不知道内存空间有多大的情况下预分配多大的ByteBuf。
AllocHandle(决定分配ByteBuf大小)
AllocHandle,其实现有多种。这里,重点来看AdaptiveRecvByteBufAllocator.HandleImpl
:
在AdaptiveRecvByteBufAllocator
内部会维护以下信息:
1 | // 初始化时的配置 |
在读取数据的时候,alloHandle
会记录一次读取总共读取了多少字节(lastBytesRead
),完成读取后会调用readComplete
会计算下次应该分配多大内存:
1 | public void readComplete() { |
当决定分配内存大小的时候调用的是guess
方法,可以看出正式上一次计算出的大小
1 | public int guess() { |
Allocator 内存分配
Allocator的内存分配实现有以下两个:
- PooledByteBufAllocator:基于内存池的字节缓冲区分配器
- UnpooledByteBufAllocator:普通的字节缓存区分配器
##TODO
- 非内存池的内存回收
- 内存池对象分配
- Netty之有效规避内存泄漏