普通的client连接后关闭出现内存泄露
244175455 opened this issue · comments
EasyLin commented
@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();
}
}
}
EasyLin commented
doashenzzg commented
强制调用System.gc()并不能保证立即回收所有的对象。垃圾回收是由垃圾回收器自动管理的,它会根据一些算法和条件来决定何时回收对象。因此,虽然你已经将对象设置为null并调用了System.gc(),但并不能保证立即回收这些对象。
client的创建和销毁是比较重的操作,建议全局初始化一次。