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 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 添加组件无法加载页面,某块加载卡住
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用