如题,通过netty传输文件,使用的协议是protobuf,这意味着我放到通道(ctx)里面的参数应该是protobuf生成的对应的java类。然后我在自定义handler的ChannelActive方法中将一个目录下的所有文件,从发送端发往接收端。然而现在测试发现当目录下的文件很多的时候,直接弹出io.netty.util.internal.OutOfDirectMemoryError:
然后我在网上看到了一些说法,表示如果使用了ByteBuf来传输的话,需要主动将ByteBuf进行release,但是我现在使用的方法是每次新建一个指定长度的byte数组,然后通过RandomAccessFile的方式来读写文件,现在我想请问,有什么办法可以解决这个报错?
是不是我需要通过其他读写文件的方式来完成?
我也同样看到有说通过判断通道是否可读,如果不可写则同步发送(等待可发送,阻塞),想请问如果通过这种方式的话,该如何去判断通道是否可写?因为可不可写不是该判断内存的使用情况吗?我怎么获得内存的使用情况呢?
netty使用protobuf协议内存溢出
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- apples_kk 2023-03-29 18:08关注
可以通过改变编程模型来避免OutOfDirectMemoryError。通常来说,将大量数据一次性传输会使内存陷入“瞬时OOM”状态,会影响程序性能,最终会导致OutOfDirectMemoryError错误。所以,不要将大量数据一次性传输,可以考虑将数据分段传输。
当然,也可以通过检查通道的可写状态来解决这个问题,一般可以使用ctx.channel().isWritable()来判断通道是否可以写入数据,当这个方法返回true时,通道可以继续发送数据,当返回false时,表示需要先等待,才能发送数据。要获取内存使用情况,可以使用Java类Runtime去获取内存使用情况,例如Runtime.getRuntime().maxMemory()、Runtime.getRuntime().totalMemory()等。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 宇视监控服务器无法登录
- ¥15 PADS Logic 原理图
- ¥15 PADS Logic 图标
- ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
- ¥15 DruidDataSource一直closing
- ¥20 气象站点数据求取中~
- ¥15 如何获取APP内弹出的网址链接
- ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
- ¥50 STM32单片机传感器读取错误
- ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据