Kafka源码解析(九)- 内存池设计BufferPool

在发送数据的流程中有一部分是要根据批次的大小申请内存,Kafka客户端使用BufferPool来实现ByteBuffer的复用,目的是减少Full Gc的可能性

BufferPool由几个重要的成员组成
free : 是一个ArrayDeque队列,其中缓存了指定大小的ByteBuffer对象
totalMemory: 记录了整个Pool大小
availableMemory:可用空间大小,这个空间是totalMemory - free 的值

首先看下申请内存的流程

1、 如果申请的内存恰好等于默认缓冲区的大小,且free里面有空闲的ByteBuffer,直接返回合适的ByteBuffer
2、如果申请的内存大于默认缓冲区的大小,计算整个free队列的空间,再加上可用内存的大小,最后分配空间
3、如果没有足够空间了,阻塞等待其他线程释放内存。

释放内存流程

内存池流程图

posted @ 2021-02-17 15:39  写写代码睡着了  阅读(11)  评论(0)    收藏  举报