为什么Java有GC还需要自己来关闭某些资源?

来源:互联网 发布:js实现旋转 编辑:程序博客网 时间:2024/04/30 18:06

为什么Java有GC还需要自己来关闭某些资源?

回复一:

因为GC只管内存不管别的资源。假如有内存以外的其它资源依附在Java对象上,如native memory(DirectByteBuffer)、file(FileInputStream)之类,那当然自己关闭最合适。为了“避免”程序员忘了自己释放那些资源,Java提供了finalizer、PhantomReference之类的机制来让程序员向GC注册“自动回调释放资源”的功能。但GC回调它们的时机不确定,所以只应该作为最后手段来使用,主要手段还是自己关闭最好。

回复二:

GC运行的时间点是不确定的(因为是一条单独存在的线程),所以很多时候你不能直接控制什么时候发生GC。这个带来的问题有两点:

一个是有时候你的内存不足需要立刻回收而GC并不会立刻运行;

另外一个是因为GC运行期间会占用大量系统资源所以某些情况下你会希望把它推后,或者干脆关掉以便根据性能需求在合适的时候手动执行。

另外,GC只能回收内存。至于各种stream之类,他们下边一般还开启了各种其他的系统资源,比如文件,比如输入输出设备(键盘/屏幕等),等等。而这些设备第一是不能自动关闭(因为谁知道你程序要用它到什么时候啊),

另一个系统内数量有限(比如键盘/屏幕同一时间只有一个)。

最后,文件和数据库连接之类的东西还存在读写锁定的问题。

这些都导致用户必须手动处理这些资源的开启和关闭。

这年头自动挡汽车都那么好了还不是有那么多人喜欢手挡,一样的。

学习Java的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:451815600【长按复制】 我们一起学Java!

0 0
原创粉丝点击