【问题标题】:the memory usage of netty normal in this dump?这个转储中netty的内存使用正常吗?
【发布时间】:2012-03-10 17:19:33
【问题描述】:

对于 13K 用户,我有以下内存转储。我将粘贴前 7 个消费者。 Netty 似乎消耗了太多的内存。这是正常的吗?

(Netty版本:3.2.7,实现IdleStateAwareChannelUpstreamHandler,总内存Netty内存使用量:最小2.5GB)

 num     #instances         #bytes  class name
----------------------------------------------
   1:      23086640      923465600  org.jboss.netty.util.internal.ConcurrentHashMap$Segment
   2:      28649817      916794144  java.util.concurrent.locks.ReentrantLock$NonfairSync
   3:      23086640      554864352  [Lorg.jboss.netty.util.internal.ConcurrentHashMap$HashEntry;
   4:        118907      275209504  [I
   5:       5184704      207388160  java.util.concurrent.ConcurrentHashMap$Segment
   6:       5184704      130874832  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
   7:       1442915      115433200  [Lorg.jboss.netty.util.internal.ConcurrentHashMap$Segment;

【问题讨论】:

  • 听起来确实很多。当用户断开连接时,您确定所有资源都被清除了吗?
  • 我保留的唯一引用是 Channel、ChannelGroup 对象。用户断开连接后我应该做一些特别的事情吗?因为我的用户(保留对 Channel、ChannelGroup 实例的引用)实例计数与并发用户计数相同。
  • 我会检查在 13,000 个用户连接后是否有这么多内存使用,但不要断开连接。或者,只有在用户多次断开连接并重新连接后,您才会获得这种用法。
  • 可能会有误解:4.4GB是总内存使用量。上面的数字表明 Netty 至少使用 2.5GB。顺便说一句,我在清理资源时是否需要考虑一些事实(netty 专用)?
  • 使用此命令转储:jmap -histo:live

标签: java memory netty


【解决方案1】:

看来内存使用不正常。

这里有一些关于 Netty 内部内存使用的事实

  • 一个通道有两个ReentrantLocks,(一个读锁,一个写锁)

  • 频道将所有频道引用存储在一个 org.jboss.netty.util.internal.ConcurrentHashMap 内部,自动 关闭时移除(这是为了分配唯一的频道 ID)。

  • ChannelGroup 在 add() 时将频道引用存储在 org.jboss.netty.util.internal.ConcurrentHashMap 中,并在关闭时自动删除。

  • org.jboss.netty.util.internal.ConcurrentHashMap 中存储的每个项目将有一个 ConcurrentHashMap$HashEntry

因此,如果您的处理程序没有泄漏任何引用,您就可以计算预期的内存使用量。

【讨论】:

  • 我能说Channel对象在断开后没有释放
  • 发现导致 netty 对象不被垃圾回收的泄漏。目前,10K 用户的堆大小仅为 200MB。这似乎很好。
猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多