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

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 怎样采集全国最新个体工商户数据
  • ¥20 我是一名大学生,想学习java是自学还是报培训班呢
  • ¥15 pycharm该如何爬取网易云歌曲下的评论?
  • ¥15 java调用sap webservice问题
  • ¥20 如何完全复现何恺明resnet论文里的结果,有代码吗,获得论文中的结果(如下图)
  • ¥15 mysql如果表行行数小于1000条还需要分区吗
  • ¥20 有关matlab自定义特殊算符的问题
  • ¥15 第15届蓝桥杯选拔赛斗鱼养殖场
  • ¥15 在vivado的FIFO使用中,FIFO有没有提供可以输出内部存储空间状态的端口?
  • ¥15 C++ QT内存数据匹配对比指导