我探索 netty 在 VM 之间通信对象。我分别使用 ObjectEncoder
和 ObjectDecoder
来序列化它们。
我很快发现此解决方案仅限于最大 1MB 大小的对象。由于我打算传达更大的对象并且我不打算限制这个大小,所以我使用 Integer.MAX_VALUE
来设置最大帧长度。
不幸的是,它看起来像这个值被用来初始化一些缓冲区,因此导致不必要的 GC-ing 并且很可能在 OutOfMemory 中。
有没有一种方法可以在使用 DynamicChannelBuffers 的同时创建无限的 ObjectEncoder/Decoder,从而不会浪费太多内存?
最佳答案
ObjectDecoder
扩展了 LengthFieldBasedFrameDecoder
,它扩展了 FrameDecoder
。 FrameDecoder
管理解码缓冲区,它使用初始容量为 256
的动态缓冲区。
然而,一旦您接收到一个大对象,动态缓冲区会自行扩展,但绝不会收缩。如果您有多个交换大对象的连接,您的 ObjectDecoder
最终都会有一个非常大的缓冲区,可能会导致 OutOfMemoryError
。
该问题已于上周修复,本周将发布新版本 (3.2.7.Final)。
关于java - 如何在不浪费内存的情况下在 JBoss-Netty 中使用无限帧大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8065022/