cat
cat copied to clipboard
netty memory leak:
Describe the bug cat中所有使用到ByteBuf的地方都没有在使用结束的时候调用release方法,这样不是会造成堆外内存泄露吗?
To Reproduce 示例:LocalMessageBucket
public MessageTree findByIndex(int index) throws IOException { try { m_lastAccessTime = System.currentTimeMillis();
byte[] data = m_reader.readMessage(index);
ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(data.length);
MessageTree tree = new DefaultMessageTree();
buf.writeBytes(data);
m_codec.decode(buf, tree);
return tree;
} catch (EOFException e) {
Cat.logError(e);
return null;
}
}
Expected behavior 是不是应该在使用ByteBuf结束的时候调用release?
public MessageTree findByIndex(int index) throws IOException {
try {
m_lastAccessTime = System.currentTimeMillis();
byte[] data = m_reader.readMessage(index);
ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(data.length);
MessageTree tree = new DefaultMessageTree();
buf.writeBytes(data);
m_codec.decode(buf, tree);
return tree;
} catch (EOFException e) {
Cat.logError(e);
return null;
}
}
Just format.
碰到这个问题了,DirectByteBuffer一直没有被释放,持有的堆外内存一直在增加;
碰到这个问题了,DirectByteBuffer一直没有被释放,持有的堆外内存一直在增加;
发生OOM了吗 解决了吗?目前我把所有的地方都加了release 但是还是会出现内存增长的问题,不知道是不是还有别的地方有泄露
我碰到的情况是经常堆内部fullGC,纳闷了。。。
碰到这个问题了,DirectByteBuffer一直没有被释放,持有的堆外内存一直在增加;
发生OOM了吗 解决了吗?目前我把所有的地方都加了release 但是还是会出现内存增长的问题,不知道是不是还有别的地方有泄露
是堆内存的老年代一直增长吗?
https://github.com/dianping/cat/pull/1280/files 可以参考这个解决netty的内存泄漏,估计性能会下降点,注意cat-clinet的兼容性
-Dio.netty.noPreferDirect=true 直接改成这个了,影响会有一点,但内存泄露的问题应该能解决了
修改代码的话,可以直接修改TcpSocketReceiver
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
真的是太难的
@yourwafer 感谢分享,我试下 下面是我查的思路 已经把netty整体升级掉了,让它使用jvm管理的直接内容,还是有问题, 我查的方向是,定时器刷数据导致问题了 内存泄漏非常有规律 整点过几分的时候少一次内存,倾向于 定时任务写入数据的时候内存泄漏了 应该每次写入数据库的时候,出现了内存泄漏,怎么出现的,不知道。太难查了
@yourwafer 感谢分享,我试下 下面是我查的思路 已经把netty整体升级掉了,让它使用jvm管理的直接内容,还是有问题, 我查的方向是,定时器刷数据导致问题了 内存泄漏非常有规律 整点过几分的时候少一次内存,倾向于 定时任务写入数据的时候内存泄漏了 应该每次写入数据库的时候,出现了内存泄漏,怎么出现的,不知道。太难查了
你用的是cat的3.0版本嘛?@xmh51
@liyinhao 不算是吧,cat没有大改的 内部魔改版本