读书人

Netty HashedWheelTimer过剩导致内存泄

发布时间: 2013-07-08 14:13:00 作者: rapoo

Netty HashedWheelTimer过多导致内存泄漏的排错

?

?

发现很多timer线程,足足有5006个。

?

思考:测试压了5000个链接,也就是说timer/channel。可能这两者有关联,先解决timer问题。

?

查看new?HashedWheelTimer的代码,发现有一处代码在每次连接时new了一个HashedWheelTimer,但是没有使用,fix it。(当然过程稍微复杂,没写的这么简单)

?

接着想线程跟内存泄漏的联系,看源码最实际,于是发现了这些timer是怎么把内存吃掉的。

?

默认每个Wheel有512个槽位,每个槽是一个MapBackedSet,每个MapBackedSet包含一个ConcurrentIdentityHashMap,每个ConcurrentIdentityHashMap默认大小为4。

?

?

for (int i = 0; i < wheel.length; i ++) {            wheel[i] = new MapBackedSet<HashedWheelTimeout>(                    new ConcurrentIdentityHashMap<HashedWheelTimeout, Boolean>(16, 0.95f, 4));        }

?

512 × 5000 × 4 =?10240000

?

很接近于10252320这个数字。OK,所有问题都解决了~!

?

?

?

?

?

读书人网 >开源软件

热点推荐