Let's say you did this:

```java
for (int i = 0; i < 1048576; i ++) {
    ByteBuf buf = ctx.alloc().buffer();
    ...
    buf.release();
}
```

Assuming that the buffer was borrowed from the thread local cache, `PoolChunkCache.allocations` will be increased by 1048576.  The size of the `PoolChunkCache` is probably much smaller than that (at worst case, it's 1.)  Then what happens if `freeUpIfNecessary()` is invoked?  IIUC, it will free the most frequently used entry pretty certainly.