Each time bind() is called a new PooledByteBufAllocator is created in setBootstrapOptions().
I would expect that this allocator is released after the channel has been closed and the garbage collector has run. But the allocator still seems to be referenced. I assume that it is related to the allocator's PoolThreadLocalCache.
The PooledByteBufAllocator still keeps some arenas with chunks around, even if they are empty.