日期:2014-05-20  浏览次数:21113 次

为什么要用close()关掉流,不是程序结束自动被gc回收吗?
对于Frame如果直接在程序中用new Frame()方式创建对象,并没有赋给引用,为什么界面不是出现一会然后马上消失呢?按理说应该被当做垃圾回收了.

对于流如果没有显示的调用close(),那么流不会被关闭,那么当程序结束的时候流的对象有被回收吗?


------解决方案--------------------
LZ好问题啊。我也不太清楚。同学习。
Frame的问题貌似是会另外启动线程的,所以不会被回收。
close估计跟流的实现机制有关吧。Java里面其实是有个Finalize的东西的。
------解决方案--------------------
程序结束就会自动回收。
但是资源是有限的,如果程序运行的时间很长,这些资源一直被占用。
多次浪费后,可能会造成系统变慢,乃至崩溃。
------解决方案--------------------
gc回收的主要是内存
close()掉的是io流,以及加在其上的共享锁,独占锁等等东西,靠gc是回收不掉的
------解决方案--------------------
那么当程序结束的时候流的对象有被回收吗?

回答你这个问题。

从操作系统角度来分析的。

对于对象回收的,主要是内存。

如果一个程序结束了,进程就消失了。

那么分给这个进程的内存也就释放了。


但是如果进程不结束。

就是程序一直运行着,程序会动态的分配内存空间。

如果动态分配的内存空间,不能得以回收。那么进程可用的内存空间就会越来越少。

垃圾回收机制,就是负责清理对象,回收内存的。

但是具体的实现要看JVM

垃圾回收机制
------解决方案--------------------
gc是主要清理内存,但close方法还要释放掉一些系统资源,比如硬盘读写所使用的资源。
另外,不close,那么程序还是在运行,没有结束,所以gc不把它当成垃圾,回收不了,所以还是要close掉。
------解决方案--------------------
如果一个流不关闭会产生一些额外问题。比如说锁定了某种资源。我记得在windows下面如果你用流打开了一个文件,没有关闭的话,这个文件就删不掉。会提示有程序在操作这个文件。而且也会占用系统句柄。自己写着玩玩的没关系,但是生产系统的程序都是7*24小时的就蛮危险。尤其是系统句柄这种资源。