我们知道有些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(); } }
谢谢!!!