如果说,Kafka处理的消息大小,与它所用的DirectMemory大小,会存在一定程度的关系。你一定会觉得非常奇怪。毕竟,阅读kafka处理消息的源码时,只看到了它申请了堆内存,并未发现有申请DirectMemory。
那么,我们写一个简化版的kafka broker 9092消息处理程序来进行一下实验。
package com.dnsanalyze.main;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class KafkaOOMTest {
//简化版的Processor处理过程;真实的kafka源码里,还会在selector里启动KafkaChannel和NetworkReceive来处理数据
public void process(Selector selector){
while(true) {
try {
selector.select();
Iterator iterator = selector.selectedKeys().iterator();
//接受到了可以读取的数据
ByteBuffer size = ByteBuffer.allocate(4);
ByteBuffer data = null;
while(iterator.hasNext()) {

本文通过一个简化的Kafka Broker程序演示了DirectMemory的使用情况。揭示了即使代码中未直接申请堆外内存,但在处理大量数据时仍可能触发DirectMemory OOM问题的原因,并提供了解决方案。
最低0.47元/天 解锁文章
172万+

被折叠的 条评论
为什么被折叠?



