测试:当指定的直接内存可分配大小没有超过,那么gc不会回收直接内存,当指定的直接内存分配大小超过,那么会把没有引用指向的直接内存回收
Netty内存管理
写了个大概意思,
我的csdn博客比较详细https://editor.csdn.net/md/?articleId=108318784
PooledByteBufAllocator
这是一个池化的分配器
1 |
|
伙伴分配算法的示例图
netty是一个数组代表 一个完全二叉树 memoryMap
流程是一个完全二叉树
一个节点的两个子节点叫做两个伙伴,只有两个伙伴都没有分配时才能合并,每次分配通过二叉树遍历找到离比指定容量大的最小的那块内存
分配需知
一页大小8K,总大小为16m
那么 可分页数就是2048页
下图文字部分有误,subpages是tiny,small等缓存分配才用到
这里有多个chunklist(qinit,q000,q025,q050,q100),但是为什么要维护这么一个chunklist
1 | void add(PoolChunk<T> chunk) { |
分配流程
PoolArea
1 |
|
PoolChunk
1 |
|
请先了解buddy算法
多页分配
1 |
|
一页分配
子页初始化
1 | id 就是 memoryMapIdx |
//子页分配算法
1 | //这是为了降低内碎片采用的,通过area(所属区域)获取子页的头 |
页内分配
tiny
1 |
|
small
1 |
|
真正的ByteBuf分配
1 |
|
池的回收
1 | AbstractReferenceCountedByteBuf |
PoolArea
1 | PoolArea |
free Chunk
1 |
|
1 |
|
- 本文作者: 忘忧症
- 本文链接: https://NepenthesZGW.github.io/2020/06/20/framework/Netty/Netty内存管理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!