我使用PooledByteBufAllocator
作为我服务器和ByteToMessageDecoder
的默认分配器。我存储由解码器创建的ByteBufs /消息(即在它们上调用retain)并在以后处理它们。这些ByteBufs
大小为4000字节。
当我使用4k字节消息对服务器进行爆破时,第一个~75000条消息全部成功,然后我看到
" java.lang.OutOfMemoryError:直接缓冲存储器"甚至是例外 虽然所有消息的总和只有300mb。另外,请注意我使用 以下设置JVM的直接内存限制: -XX:MaxDirectMemorySize =2克
内存的剩余部分~1700mb在哪里?
我根本没有从我的来源调用分配,而且似乎不太可能是开销。
我注意到解码器分配的ByteBufs的容量大约等于消息大小的两倍(即8014),但只占另一个~300mb(如果分配了所有容量) ,它仍然没有解释其余的直接记忆被消耗的地方。
奇怪的是,当我复制从解码器分配的ByteBufs并释放原始缓冲区并稍后处理副本时,我能够做~500000个请求/消息(相当于2GB的直接内存),这就是我所期望的
我注意到复制的ByteBufs的容量等于消息大小,小于解码器的ByteBufs容量。
注意:我使用的是netty 4.0.35.Final