如何在不浪费内存的情况下在JBoss-Netty中使用无限制的Frame-Sizes?

时间:2011-11-09 12:27:45

标签: java buffer limit netty encoder

我探索 netty 以在虚拟机之间传递对象。我使用ObjectEncoder& ObjectDecoder分别序列化这些。

我很快发现这个解决方案仅限于最大1MB大小的对象。由于我打算传达更大的对象,并且我不打算限制此大小,我使用Integer.MAX_VALUE来设置最大帧长度。

不幸的是,看起来这个值被用来初始化一些缓冲区,从而导致不必要的GC-ing,很可能在OutOfMemory中。

有没有办法在使用DynamicChannelBuffers时创建无限制的ObjectEncoder / Decoder,以免浪费太多内存?

1 个答案:

答案 0 :(得分:4)

ObjectDecoder扩展LengthFieldBasedFrameDecoder,扩展FrameDecoderFrameDecoder管理解码缓冲区,它使用初始容量为256的动态缓冲区。

但是,一旦收到大对象,动态缓冲区就会自行扩展,但永远不会收缩。如果您有多个交换大型对象的连接,则ObjectDecoder最终将拥有一个非常大的缓冲区,可能会导致OutOfMemoryError

此问题已于上周修复,本周将发布新版本(3.2.7.Final)。