netty 服务报错:io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 776021360 byte(s) of direct memory (used: 1887672356, max: 2058354688)
首先使用jdk 工具分析jvm 内存情况:
1、jmap -heap PID 查看堆区内存情况
2、增加 参数-XX:NativeMemoryTracking=detail ;
jcmd [pid ] VM.native_memory scale=MB 查看所有占用内存情况;
3、调测过程 打开top -p [pid] 监控进程状态
4、使用jstack [pid] 查看线程状态
5、增加参数:-Dio.netty.leakDetectionLevel=PARANOID 日志打印内存泄漏日志
通过日志可以分析出哪里创建的对象未被回收。
ERROR [2023-03-09 13:41:47,569] ({nioEventLoopGroup-3-2} ResourceLeakDetector.java[reportTracedLeak]:319) - LEAK: ByteBuf.release() was not called before it's garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records:
#1:
io.netty.buffer.AdvancedLeakAwareByteBuf.discardReadBytes(AdvancedLeakAwareByteBuf.java:125)
io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.offer(HttpPostMultipartRequestDecoder.java:351)
io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.offer(HttpPostMultipartRequestDecoder.java:54)
.....
.......
Created at:
io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:403)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:188)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:179)
io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:116)
io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.offer(HttpPostMultipartRequestDecoder.java:343)
io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.<init>(HttpPostMultipartRequestDecoder.java:206)
io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.<init>(HttpPostRequestDecoder.java:93)
io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.<init>(HttpPostRequestDecoder.java:69)
日志说明HttpPostRequestDecoder 对象未被回收,调用回收即可解决
6、上传dump 文件:jmap -dump:format=b,file=heapdump.hprof [pid]
使用Eclipse Memory Analyser 分析内存对象占用,以及是否有泄漏。