关于java gc和有close方法的对象

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

谢谢!!!

猜你喜欢

转载自zhuwx.iteye.com/blog/2371226