Kafka 生产者投递内存池源码刨铣

大体逻辑是这样的。。 初始化BufferPool的时候会指定BufferPool的大小 以及内存块(poolableSize)的大小。 在申请内存的时候如果申请的内存大小大于指定的内存块大小就会抛出异常,无法申请。 如果是等于poolableSize的话,就会判断free中是否有,有的话就直接从free中取出,没有的话再去申请(这个free可以里面为一个缓存,每次归还的时候会归还到free中(前提free中的ByteBuffer的大小和poolableSize一致))。如果是小于poolableSize的话,就不会从free中获取,而是单独去申请。 判断内存池中剩余的空间大小是通过(nonPooledAvailableMemory) 来控制的。。。 如果申请的时候内存不足,会等待(Deque waiters),当归还的时候会唤醒等待的节点然后再去分配内存

如果需要再本地调试的时候 (可以使用如下代码进行debug)

public class TestKafkaBufferPoolDemo {

public static void main(String[] args) throws InterruptedException {

复制代码
    Metrics metrics = new Metrics();


    BufferPool bufferPool =  new BufferPool(65536, 16384, metrics, Time.SYSTEM, "producer-metrics");


    ByteBuffer byteBuffer = bufferPool.allocate(6000005, 1);
    bufferPool.deallocate(byteBuffer);


    ByteBuffer byteBuffer2 = bufferPool.allocate(16384, 1);

// bufferPool.deallocate(byteBuffer);

ByteBuffer allocate = bufferPool.allocate(16384, 1);

ByteBuffer allocate2 = bufferPool.allocate(16384, 1);

复制代码
    ByteBuffer allocate3 = bufferPool.allocate(16384, 1);

    ByteBuffer byteBuffer3 = bufferPool.allocate(16384, 10000);
}

}

相关推荐
CodeCraft Studio3 分钟前
国产化PDF处理控件Spire.PDF教程:如何在 Java 中通过模板生成 PDF
java·python·pdf·spire.pdf·java创建pdf·从html创建pdf
阿方.91825 分钟前
《数据结构全解析:栈(数组实现)》
java·开发语言·数据结构
YC运维29 分钟前
Ansible题目全解析与答案
java·算法·ansible
程序员清风39 分钟前
贝壳一面:年轻代回收频率太高,如何定位?
java·后端·面试
考虑考虑1 小时前
Java实现字节转bcd编码
java·后端·java ee
软件开发-NETKF88881 小时前
JSP到Tomcat特详细教程
java·开发语言·tomcat·jsp·项目运行
渣哥1 小时前
为什么 JDK 1.8 要给 HashMap 加红黑树?
java
我登哥MVP1 小时前
Java 网络编程学习笔记
java·网络·学习
大厂码农老A1 小时前
面试官:“聊聊你最复杂的项目?” 为什么90%的候选人第一句就栽了?
java·面试
爱读源码的大都督1 小时前
Java已死?别慌,看我如何用Java手写一个Qwen Code Agent,拯救Java
java·人工智能·后端