【发布时间】: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