我们知道有些java对象比如socket,io流等是有close方法的,一般可以在finally块内调用然后释放资源,假如我们忘记调用close方法,当java gc这个对象的时候也会释放资源,不过java gc是不能确定时间的,所以最好用完了就手工close一下。
下面我们用ServerSocket的例子来证明垃圾回收是会释放内存和端口的:
import java.net.ServerSocket;
public class TestSocketGc {
public static void main(String[] args) throws Exception {
System.out.println("start");
sub();
//sub里面的serverSocket此时超出作用域了,通知jvm可以gc一下
//如果不手工gc一下,假设内存资源充足,jvm也不会自动gc
System.gc();
//休息一下让jvm有时间回收sub里面的serverSocket
Thread.sleep(3000);
/**
* 如果注释掉上面两句,没释放资源,
* 因为端口占用,下面一句将抛异常:
* java.net.BindException: Address already in use: JVM_Bind
*/
ServerSocket serverSocket = new ServerSocket(4567);
System.out.println("end");
}
public static void sub() throws Exception {
ServerSocket serverSocket = new ServerSocket(4567);
//serverSocket.close();
//serverSocket = null;
//System.gc();
}
}
谢谢!!!