netty API 中的内存泄漏

Posted

技术标签:

【中文标题】netty API 中的内存泄漏【英文标题】:Memory leak in netty API 【发布时间】:2014-04-24 06:50:30 【问题描述】:

我是 netty API 的新手 我正在使用netty3.5.2开发客户端和服务器通信服务器, 但是应用程序总是运行完整的 GC, 我使用 jmap 转储内存和 使用 jhat 显示哪个对象占用了内存。 并且有 6413363 个 DefaultChannelFuture 实例。 有人可以告诉哪个线程创建DefaultChannelFuture 实例 以及它们将如何以及何时发布?

怀疑的前 4 个实例 类org.jboss.netty.channel.DefaultChannelFuture的6413363个实例 类org.jboss.netty.util.internal.LinkedTransferQueue$Node的631971个实例 类org.jboss.netty.buffer.BigEndianHeapChannelBuffer的630934个实例 类org.jboss.netty.channel.DownStreamMessageEvent的630767个实例

【问题讨论】:

你能把堆转储上传到某个地方吗?这将有助于了解发生了什么。 谢谢,但是转储文件非常大,有 2G 字节,我无法上传它 如果您使用的是 Eclipse,请尝试 MAT:eclipse.org/mat 这将为您提供有关泄漏嫌疑人的良好信息。我正在使用 Netty 3.6.6,我没有这样的问题。你能把你自定义的UpstreamHandlers和DownstreamHandlers的代码贴出来吗? 【参考方案1】:

您快速生成消息。它使消息队列过载。

检查网络负载。

【讨论】:

【参考方案2】:

这个问题现在有点老了,所以不确定你是否找到了答案。我没用过,但Netty in Action 书中描述了一种检漏仪:

Netty 包含一个所谓的ResourceLeakDetector,它将对大约 1% 的缓冲区分配进行采样,以检查您的应用程序中是否存在泄漏。 如果检测到泄漏,您将看到类似于以下内容的日志消息:

泄漏:在垃圾收集之前未调用 ByteBuf.release()。启用高级 泄漏报告以找出泄漏发生的位置。启用高级泄漏 报告,指定JVM选项

-Dio.netty.leakDetectionLevel=advanced 或 称呼 ResourceLeakDetector.setLevel()

【讨论】:

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

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

Netty源码-内存泄漏检测toLeakAwareBuffer

netty内存泄漏

Netty防止内存泄漏措施

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

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