Violetttte 2023-03-29 17:42 采纳率: 82.8%
浏览 28
已结题

netty使用protobuf协议内存溢出

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

  • 写回答

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条)

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月30日
  • 创建了问题 3月29日

悬赏问题

  • ¥15 关于#wireshark#的问题:并且能够给数据做标注,如这个流量是在看视频或者是在转账
  • ¥90 请问,这个视频播放软件的名称,用过的朋友请给答案,上方..avi是啥意思?是看短剧还是播放本地视频?
  • ¥15 运筹优化,gurobi,python
  • ¥15 基于python的电影系统推荐
  • ¥20 springmvc重定向和返回json
  • ¥15 数学建模——参会安排怎么做
  • ¥15 电脑键盘实现触摸功能
  • ¥25 matlab无法将表达式转换为双数组怎么解决?
  • ¥15 单片机汇编语言相关程序
  • ¥20 家用射频美容仪技术规格