如果遇到类似的问题,我会遇到一些奇怪的问题/行为,例如Spring ResetController请求。 由于我对Spring不太熟悉,也许很正常,我很惊讶,在收到一些POST请求后,在调用过程中创建的对象没有从内存中删除。
@RequestMapping(method = RequestMethod.POST, value = "/run2")
public String api2() {
try {
new ServerSocket(8887);
return "run2";
} catch(Exception ex) {
return "run2nok";
}
}
据我了解,每次我调用new ServerSocket(8887)
时,只要不使用该端口,便可以绑定该端口。据我所知,这个短代码的生命周期应该在返回之后结束。
但是,当我进行第二次POST调用时,它无法绑定到端口,并且通过签入CMD netstat | findstr: 8887
被使用。
但是,如果我呼叫System.gc()
,则该端口将被释放,并且可以根据需要进行第二次POST。
那么,请求结束后,该对象是否仍在正常使用?还是我需要做一些事情来释放端口?
答案 0 :(得分:3)
您永远不应该依赖于及时进行自动清理的东西-它可能立即发生,以后发生或永远不会发生(甚至无法保证会响应System.gc()
发生)。
如果需要清理,请明确进行清理(例如,通过finally或使用try-with-resources)。