Netty Socket实时行情导致内存泄露的一种情况

如题所述

第1个回答  2022-05-21
在开发中内存泄露在c,c++时常存在,但是在Java开发中很少,但也偶尔会有。而用Netty开发的程序也是比较容易出现内存泄露的。下面例举实际开发中会出现内存泄露的例子:

描述下实际场景:如果你用java+netty开发了一款实时推送客户端的股票交易的后端程序,而客户端用websocket连接后端,实时显示推送的行情。如果客户拿着手机在地铁,隧道等信号不好的地方,或者手机可能使用的2G等情况,准确来说:就是可以连接到后端的Java Netty socket程序上,但是行情变化的数据量大于网络可以传输的数据量,这时候会出现客户端没法接受“大量行情”的情况,这个时候如果Java Netty的后端程序不做特殊处理。就会导致一直往这个通道大小有限制,但实时在线的通道中发送数据,因通道有大小最后导致,服务器内存接受了额外的“行情数据”。如果有这样很多的客户,其实实际就是有这样很多的客户,访问服务器,最终服务器很快就会内存溢出,最终导致程序必须重启。

当然这种情况应该存在于外汇行情,实时聊天,消息推送等场景中,大家可以参考下面解法。

上面是问题描述,下来说下怎么解决:

主要在发送前注意判断通道要处于可写状态 ,即这个通道是可用的且通道还可以写入数据,也就是说客户端还可以接受数据,代码主要是: