daoshenzzg / socket-mqtt

基于Netty+MQTT的高性能推送服务框架。支持普通Socket、MQTT、MQTT web socket协议。非常方便接入上层业务实现推送业务。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

普通的client连接后关闭出现内存泄露

244175455 opened this issue · comments

@service("ClientServiceImpl")
public class ClientServiceImpl implements IClientService {

public String messageSend(String ip,Integer port,String message){
    MsgDecoder decoder = new MsgDecoder();
    MsgEncoder encoder = new MsgEncoder();
    Client client=new Client();
    client.setIp(ip);
    client.setPort(port);
    client.setConnectTimeout(10000);
    client.setCheckHeartbeat(false);
    client.addChannelHandler("decoder", decoder);
    client.addChannelHandler("encoder", encoder);
    client.connect();
    Request request = new Request();
    request.setSequence(1);
    request.setMessage(message);
    Response response=null;
    try {
        response = client.sendWithSync(request, 30000);
        client.shutdown();
        return response.getResult().toString();
    }catch (Exception e){
        client.shutdown();
        log.error("消息发送失败:{},指令:{}",e.getMessage(),message);
        throw new RestfulEx(RestfulStatus.H500,"消息发送失败!");
    }finally {
        //强制回收内存
        client=null;
        decoder=null;
        encoder=null;
        request=null;
        response=null;
        System.gc();
    }
}

}

Snipaste_2022-08-01_13-56-12

调用后这些对象一直无法回收

强制调用System.gc()并不能保证立即回收所有的对象。垃圾回收是由垃圾回收器自动管理的,它会根据一些算法和条件来决定何时回收对象。因此,虽然你已经将对象设置为null并调用了System.gc(),但并不能保证立即回收这些对象。

client的创建和销毁是比较重的操作,建议全局初始化一次。