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);
}

}

相关推荐
无名指的等待71210 小时前
Redisson的Lock和TryLock的区别
java·开发语言·数据库
new_daimond10 小时前
Apache Shiro 技术详解
java·apache
yuriy.wang10 小时前
Spring IOC源码篇六 核心方法obtainFreshBeanFactory.parseCustomElement
java·后端·spring
.鸣10 小时前
idea学习日记10: 字符串相关类的底层原理
java·学习
Hello.Reader10 小时前
Kafka 安全性认证、加密、授权与落地最佳实践
分布式·kafka
坐吃山猪10 小时前
Kafka09-速答-尚硅谷
kafka
在未来等你10 小时前
Kafka面试精讲 Day 24:Spring Kafka开发实战
java·spring boot·面试·kafka·消息队列·spring kafka·@kafkalistener
龙茶清欢11 小时前
1、Lombok入门与环境配置:理解Lombok作用、配置IDE与构建工具
java·spring boot·spring cloud
龙茶清欢11 小时前
2、Nginx 与 Spring Cloud Gateway 详细对比:定位、场景与分工
java·运维·spring boot·nginx·spring cloud·gateway
Eoch7711 小时前
HashMap夺命十连问,你能撑到第几轮?
java·后端