我探索 netty 以在虚拟机之间传递对象。我使用ObjectEncoder
& ObjectDecoder
分别序列化这些。
我很快发现这个解决方案仅限于最大1MB大小的对象。由于我打算传达更大的对象,并且我不打算限制此大小,我使用Integer.MAX_VALUE
来设置最大帧长度。
不幸的是,看起来这个值被用来初始化一些缓冲区,从而导致不必要的GC-ing,很可能在OutOfMemory中。
有没有办法在使用DynamicChannelBuffers时创建无限制的ObjectEncoder / Decoder,以免浪费太多内存?
答案 0 :(得分:4)
ObjectDecoder
扩展LengthFieldBasedFrameDecoder
,扩展FrameDecoder
。 FrameDecoder
管理解码缓冲区,它使用初始容量为256
的动态缓冲区。
但是,一旦收到大对象,动态缓冲区就会自行扩展,但永远不会收缩。如果您有多个交换大型对象的连接,则ObjectDecoder
最终将拥有一个非常大的缓冲区,可能会导致OutOfMemoryError
。
此问题已于上周修复,本周将发布新版本(3.2.7.Final)。