是啥导致了netty中的这种内存泄漏

Posted

技术标签:

【中文标题】是啥导致了netty中的这种内存泄漏【英文标题】:what is causing this memory leak in netty是什么导致了netty中的这种内存泄漏 【发布时间】:2012-09-02 15:39:56 【问题描述】:

我有两个服务器进程,它们通过两个套接字连接进行通信。两个连接都只能单向发送消息。(一个用于 c->s,一个用于 s->c)。

服务端和客户端分别用 OioserverSocketChannelFactory / OioClientSocketChannelFactory 初始化。

经过一些分析,发现这三个类的对象从未释放(在双方)。我不直接使用这些类,我只保留对两个 Channel 对象的引用。

java.util.concurrent.LinkedTransferQueue$Node 1005351 32171232  
org.jboss.netty.channel.Channels$2 1005351 24128424  
org.jboss.netty.channel.socket.ChannelRunnableWrapper 1005351 48256848  

我的代码中泄露了什么样的对象可能导致这些对象无法释放?

更新:环境,jdk7u7,centos6 64bit,netty 3.5.3

【问题讨论】:

连接完成后要关闭频道吗? 没有。在服务器进程关闭之前,连接不会关闭。 而且我说的客户端也是一个服务器进程,只是表示连接由这个服务器启动,这个服务器进程只有一个实例。所以两边的总连接数是两个。 【参考方案1】:

这是因为 Netty Oio impl 中的一个错误。该错误已作为 3.5.4.Final 的一部分得到修复。所以请升级到 3.5.4.Final 或 3.5.5.Final。

参见 [1]。

[1]https://github.com/netty/netty/issues/520

【讨论】:

【参考方案2】:

这很有可能是 netty 的一个错误。在我将 OioServerSocketChannelFactory / OioClientSocketChannelFactory 更改为 NioServerSocketChannelFactory / NioClientSocketChannelFactory 后,问题就消失了。

【讨论】:

以上是关于是啥导致了netty中的这种内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

由于 Netty 中的 ByteBuffers 导致的内存泄漏

为啥 Netty ByteBuf.readBytes 会导致内存泄漏?

Netty堆外内存泄漏排查,这一篇全讲清楚了

QByteArray导致的内存泄漏问题

Netty防止内存泄漏措施

关于 MpscAtomicArrayQueue 的 Netty 内存泄漏