概述
BufferPool是缓存给定memory大小的ByteBuffer池。这个类主要应用于Producer的需求。因此,它有以下2个属性:
- 只有符合pooled size大小的ByteBuffer会被缓存并循环使用。
- BufferPool是公平的,内存优先给等待时间最长的线程使用,除非它有充足的内存。它能有效防止线程饥饿和死锁的发生。
Pooled Buffer Memory & nonPooled Available memory
BufferPool将内存管理分为2部分:
- Pooled Memory:池化的ByteBuffer内存。该部分内存的媒介是一个Deque<ByteBuffer>类型的队列,ByteBuffer的大小必须符合Pooled size大小。如果用户申请内存的size大小刚好是pooled size,则从Deque中弹出一个ByteBuffer以供使用。
- nonPooled Memory:未经池化的可用内存。当用户申请的内存的size大小不为pooledsize时,则分配的内存称为未经池化的可用内存。BufferPool会记录这部分内存的大小。Pooled memory与nonPooled memory的内存大小之和不能超过BufferPool的totalMemory。当用户申请的不规则内存的大小大于nonPooled memory时,会将Pooled memory占据的内存释放,来以此调大nonPooled memory的大小。
allocate & deallocate