netty使用protobuf协议内存溢出

如题,通过netty传输文件,使用的协议是protobuf,这意味着我放到通道(ctx)里面的参数应该是protobuf生成的对应的java类。然后我在自定义handler的ChannelActive方法中将一个目录下的所有文件,从发送端发往接收端。然而现在测试发现当目录下的文件很多的时候,直接弹出io.netty.util.internal.OutOfDirectMemoryError:
然后我在网上看到了一些说法,表示如果使用了ByteBuf来传输的话,需要主动将ByteBuf进行release,但是我现在使用的方法是每次新建一个指定长度的byte数组,然后通过RandomAccessFile的方式来读写文件,现在我想请问,有什么办法可以解决这个报错?
是不是我需要通过其他读写文件的方式来完成?
我也同样看到有说通过判断通道是否可读,如果不可写则同步发送(等待可发送,阻塞),想请问如果通过这种方式的话,该如何去判断通道是否可写?因为可不可写不是该判断内存的使用情况吗?我怎么获得内存的使用情况呢?

可以通过改变编程模型来避免OutOfDirectMemoryError。通常来说,将大量数据一次性传输会使内存陷入“瞬时OOM”状态,会影响程序性能,最终会导致OutOfDirectMemoryError错误。所以,不要将大量数据一次性传输,可以考虑将数据分段传输。

当然,也可以通过检查通道的可写状态来解决这个问题,一般可以使用ctx.channel().isWritable()来判断通道是否可以写入数据,当这个方法返回true时,通道可以继续发送数据,当返回false时,表示需要先等待,才能发送数据。要获取内存使用情况,可以使用Java类Runtime去获取内存使用情况,例如Runtime.getRuntime().maxMemory()、Runtime.getRuntime().totalMemory()等。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^