【问题标题】:Memory leak in netty APInetty 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的代码贴出来吗?

标签: java netty


【解决方案1】:

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

检查网络负载。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多