OutOfMemoryError:直接缓冲内存

时间:2016-04-21 08:19:01

标签: java out-of-memory netty

我使用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

0 个答案:

没有答案