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,所有问题都解决了~!
?
?
?
?
?