ByteBuf发行方案

时间:2019-05-09 12:30:47

标签: java netty

最近,我们从Netty 3.x升级到了最新的4.x。升级后,我们在生产系统中发现了Netty ByteBuf专用的可怕的OOM。

我们使用system属性打开了泄漏检测功能,但是由于某种原因,这似乎并没有在日志中输出任何内容,最终我们仍然收到OOM Netty错误。

为避免OOM,我们在以下位置允许Netty管理消息/ ByteBuf的发布:

SimpleChannelInboundHandler-释放读取的消息 ByteToMessageDecoder-释放ByteBuf

我有预感的其余地方可能会在出现异常的情况下产生问题。

场景1: 读取输入流并为每次读取创建一个ByteBuf,然后将ByteBuf写入通道。我可以看到在向通道写入它关闭或发生异常的位置时,永远不会读取此ByteBuf,也永远不会释放它。如果发生这种情况,我必须释放该ByteBuf吗?我在测试期间尝试发布它,但随后却出现异常,因为它没有任何引用。如果它没有任何引用,那么它真的会造成内存泄漏吗?我确实读过另一个问题,您需要读取所有字节,然后释放ByteBuf。这是真的吗?

方案2: 我有2个已建立的频道。当我在一个频道上收到一条消息时,我们只需将其写入另一个频道。如果没有异常发生,那么我们发送ByteBuf的另一个通道将在消耗并发送字节后释放ByteBuf。但是可以说,将其写入另一个通道失败,但有一个例外,因为该通道现在已关闭或发生了其他事情。同样,此ByteBuf永远不会被读取,因为无法将其写入其他通道。如果发生这种情况,我必须释放ByteBuf吗?再次需要消耗它然后释放它吗?

0 个答案:

没有答案