cat icon indicating copy to clipboard operation
cat copied to clipboard

netty memory leak:

Open MrCoderYu opened this issue 4 years ago • 11 comments

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?

MrCoderYu avatar Aug 10 '20 09:08 MrCoderYu

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.

blackstorm avatar Aug 11 '20 03:08 blackstorm

碰到这个问题了,DirectByteBuffer一直没有被释放,持有的堆外内存一直在增加; image

wyt avatar Aug 12 '20 03:08 wyt

碰到这个问题了,DirectByteBuffer一直没有被释放,持有的堆外内存一直在增加; image

发生OOM了吗 解决了吗?目前我把所有的地方都加了release 但是还是会出现内存增长的问题,不知道是不是还有别的地方有泄露

MrCoderYu avatar Aug 12 '20 04:08 MrCoderYu

image

我碰到的情况是经常堆内部fullGC,纳闷了。。。

lzqdename avatar Sep 13 '20 03:09 lzqdename

碰到这个问题了,DirectByteBuffer一直没有被释放,持有的堆外内存一直在增加; image

发生OOM了吗 解决了吗?目前我把所有的地方都加了release 但是还是会出现内存增长的问题,不知道是不是还有别的地方有泄露

是堆内存的老年代一直增长吗?

lzqdename avatar Sep 13 '20 03:09 lzqdename

https://github.com/dianping/cat/pull/1280/files 可以参考这个解决netty的内存泄漏,估计性能会下降点,注意cat-clinet的兼容性

xmh51 avatar Sep 06 '21 04:09 xmh51

-Dio.netty.noPreferDirect=true 直接改成这个了,影响会有一点,但内存泄露的问题应该能解决了

yourwafer avatar Oct 15 '21 07:10 yourwafer

修改代码的话,可以直接修改TcpSocketReceiver bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); 真的是太难的

yourwafer avatar Oct 15 '21 07:10 yourwafer

@yourwafer 感谢分享,我试下 下面是我查的思路 已经把netty整体升级掉了,让它使用jvm管理的直接内容,还是有问题, 我查的方向是,定时器刷数据导致问题了 内存泄漏非常有规律 整点过几分的时候少一次内存,倾向于 定时任务写入数据的时候内存泄漏了 应该每次写入数据库的时候,出现了内存泄漏,怎么出现的,不知道。太难查了

xmh51 avatar Oct 16 '21 14:10 xmh51

@yourwafer 感谢分享,我试下 下面是我查的思路 已经把netty整体升级掉了,让它使用jvm管理的直接内容,还是有问题, 我查的方向是,定时器刷数据导致问题了 内存泄漏非常有规律 整点过几分的时候少一次内存,倾向于 定时任务写入数据的时候内存泄漏了 应该每次写入数据库的时候,出现了内存泄漏,怎么出现的,不知道。太难查了

你用的是cat的3.0版本嘛?@xmh51

liyinhao avatar Oct 25 '21 10:10 liyinhao

@liyinhao 不算是吧,cat没有大改的 内部魔改版本

xmh51 avatar Oct 28 '21 19:10 xmh51