java - 如何在不浪费内存的情况下在 JBoss-Netty 中使用无限帧大小?

标签 java buffer limit netty encoder

我探索 netty 在 VM 之间通信对象。我分别使用 ObjectEncoderObjectDecoder 来序列化它们。

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

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

有没有一种方法可以在使用 DynamicChannelBuffers 的同时创建无限的 ObjectEncoder/Decoder,从而不会浪费太多内存?

最佳答案

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

然而,一旦您接收到一个大对象,动态缓冲区会自行扩展,但绝不会收缩。如果您有多个交换大对象的连接,您的 ObjectDecoder 最终都会有一个非常大的缓冲区,可能会导致 OutOfMemoryError

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

关于java - 如何在不浪费内存的情况下在 JBoss-Netty 中使用无限帧大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8065022/

相关文章:

java - 没有画廊的android coverflow

java - 使用 Ctrl+C 携带存储语句的缓冲区

c++ - 从套接字读取到缓冲区

mysql - 按有限数量的不同值进行选择

mysql - SQL 加入限制范围

java - 如何使用字符串作为参数来表示 Java 中的对象?

java - 在 AppEngine Datastore (Objectify) 中定义内部类

java - 在 Coverting words to number 中使用 StringTokenizer

c++ - 缓冲压缩流 C++

java - 为什么 Java.Time.Year 被任意限制为小于其原始限制?