为什么Java有GC还需要自己来关闭某些资源?
2016-09-26 10:17
429 查看
因为GC只管内存不管别的资源。假如有内存以外的其它资源依附在Java对象上,如native memory(DirectByteBuffer)、file(FileInputStream)之类,那当然自己关闭最合适。为了“避免”程序员忘了自己释放那些资源,Java提供了finalizer、PhantomReference之类的机制来让程序员向GC注册“自动回调释放资源”的功能。但GC回调它们的时机不确定,所以只应该作为最后手段来使用,主要手段还是自己关闭最好。
回复二:
GC运行的时间点是不确定的(因为是一条单独存在的线程),所以很多时候你不能直接控制什么时候发生GC。这个带来的问题有两点:
一个是有时候你的内存不足需要立刻回收而GC并不会立刻运行;
另外一个是因为GC运行期间会占用大量系统资源所以某些情况下你会希望把它推后,或者干脆关掉以便根据性能需求在合适的时候手动执行。
另外,GC只能回收内存。至于各种stream之类,他们下边一般还开启了各种其他的系统资源,比如文件,比如输入输出设备(键盘/屏幕等),等等。而这些设备第一是不能自动关闭(因为谁知道你程序要用它到什么时候啊),
另一个系统内数量有限(比如键盘/屏幕同一时间只有一个)。
最后,文件和数据库连接之类的东西还存在读写锁定的问题。
这些都导致用户必须手动处理这些资源的开启和关闭。
这年头自动挡汽车都那么好了还不是有那么多人喜欢手挡,一样的。
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:451815600【长按复制】 我们一起学Java!
相关文章推荐
- 设计自己的基于Selenium 的自动化测试框架-Java版(1) - 为什么selenium还需要测试框架?
- 设计自己的基于Selenium 的自动化测试框架-Java版(1) - 为什么selenium还需要测试框架?
- 设计自己的基于Selenium 的自动化测试框架-Java版(1) - 为什么selenium还需要测试框架?
- 设计自己的基于Selenium 的自动化测试框架-Java版(1) - 为什么selenium还需要测试框架?
- java基础—JVM内存结构,为什么需要GC?
- 为什么用java的URL定位资源图片需要刷新界面才能显示
- (java 必备知识之三) 浅谈java散列原理,为什么java需要散列集合?
- 雷军:为什么马云马化腾创业那么容易成功 自己却需要煎熬数年
- java开发为什么需要UML
- 一些java类中为什么需要重载 serialVersionUID 属性
- 软件测试开发技术Java开发为什么需要UML
- 雷军:为什么马云马化腾创业那么容易成功 自己却需要煎熬数年
- 雷军:为什么马云马化腾创业那么容易成功 自己却需要煎熬数年
- java 中实现象开发环境中那样,需要某些面板时点击展开,不需要时点击让其收缩
- java为什么需要持久化?
- 自己遇到的"Microsoft Management Console遇到问题需要关闭,我们对此引起的不便表示抱歉……"问题的解决方法
- 雷军:为什么马云马化腾创业那么容易成功 自己却需要煎熬数年
- 为什么网站需要发布自己的Service API【宝狼观潮】
- JAVA里面局部变量需要显式初始化,谁能解释编译器为什么这样设计?
- 雷军:为什么马云马化腾创业那么容易成功 自己却需要煎熬数年