Caused by: java.lang.OutOfMemoryError: Cannot reserve 2269664 bytes of direct buffer memory (allocated: 9970390, limit: 10485760)
Java NIO 에서 해당 메모리를 사용해서 효율적인 방법으로 네트워크, 디스크에 데이터를 쓴다. (쓰기가 빠르다고 함)
java.nio.DirectByteBuffer 를 사용하는 곳에서 OOM - Direct Buffer Memory 가 발생할 수 있음
Direct Buffer Memory는 JVM Heap 영역 외부의 native memory 영역에서 별도로 관리
기본값은?
default 10MB
10MB -> 100MB로 늘리기로 결정
적용법
ByteBuffer directBuf = ByteBuffer.allocateDirect(100);
또는
-XX:MaxDirectMemorySize=100M
Redis Client로 사용중인 Lettuce 내부의 netty ByteBuf 객체 null 문제
CommandHandler.java → channelRead()-> this.buffer.refCnt() 에서 NPE 발생
private ByteBuf buffer;
package io.netty.buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
...
public abstract class ByteBuf implements ReferenceCounted, Comparable<ByteBuf>, ByteBufConvertible {
public ByteBuf() {
}
CommandHandler.java → channelRead()-> input.release()
Caused by: java.lang.OutOfMemoryError: Cannot reserve 2269664 bytes of direct buffer memory (allocated: 9970390, limit: 10485760)
at java.base/java.nio.Bits.reserveMemory(Unknown Source) ~[na:na]
at java.base/java.nio.DirectByteBuffer.<init>(Unknown Source) ~[na:na]
at java.base/java.nio.ByteBuffer.allocateDirect(Unknown Source) ~[na:na]
at java.base/sun.nio.ch.Util.getTemporaryDirectBuffer(Unknown Source) ~[na:na]
at java.base/sun.nio.ch.IOUtil.read(Unknown Source) ~[na:na]
at java.base/sun.nio.ch.IOUtil.read(Unknown Source) ~[na:na]
at java.base/sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[na:na]
at org.apache.kafka.common.network.PlaintextTransportLayer.read(PlaintextTransportLayer.java:103) ~[kafka-clients-3.7.0.jar:na]
read에서 크게 2가지 작업을 함
IOUtil.read() → Util.getTemporaryDirectBuffer() → ByteBuffer.allocateDirect()
offerFirstTemporaryDirectBuffer() → free()