`
halloffame
  • 浏览: 54682 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

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

 

谢谢!!!

1
1
分享到:
评论
2 楼 halloffame 2017-04-28  
somefuture 写道
你只是想说不close也可以吗

是这个意思,但是不手动close的话,要等jvm垃圾回收才能释放掉占用的端口,那jvm什么时候垃圾回收就不能确定时间了,所以最好手工close掉这类对象,免得端口资源被占用。
1 楼 somefuture 2017-04-26  
你只是想说不close也可以吗

相关推荐

Global site tag (gtag.js) - Google Analytics