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,我没有这样的问题。你能把你自定义的UpstreamHandler
s和DownstreamHandler
s的代码贴出来吗?
【参考方案1】:
您快速生成消息。它使消息队列过载。
检查网络负载。
【讨论】:
【参考方案2】:这个问题现在有点老了,所以不确定你是否找到了答案。我没用过,但Netty in Action 书中描述了一种检漏仪:
Netty 包含一个所谓的
ResourceLeakDetector
,它将对大约 1% 的缓冲区分配进行采样,以检查您的应用程序中是否存在泄漏。 如果检测到泄漏,您将看到类似于以下内容的日志消息:泄漏:在垃圾收集之前未调用 ByteBuf.release()。启用高级 泄漏报告以找出泄漏发生的位置。启用高级泄漏 报告,指定JVM选项
-Dio.netty.leakDetectionLevel=advanced
或 称呼ResourceLeakDetector.setLevel()
【讨论】:
以上是关于netty API 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
由于 Netty 中的 ByteBuffers 导致的内存泄漏