黑马程序员技术交流社区

标题: 关于finally和jvm垃圾回收的提问 [打印本页]

作者: 路西法    时间: 2014-4-1 10:01
标题: 关于finally和jvm垃圾回收的提问
java虚拟机不是有垃圾回收机制吗?那为什么还需要手动的添加finally来关闭资源呢.    各位有空帮我解释一下

作者: osully    时间: 2014-4-1 10:19
你上完厕所就冲一下呗,
非要等到阿姨来清理吗
做个文明人.....
作者: 一诺千金    时间: 2014-4-1 10:19
Java 的垃圾回收器要负责完成3 件任务:
1.分配内存
2.确保被引用的对象的内存不被错误回收
3.回收不再被引用的对象的内存空间。
关闭资源:
在实际开发中,经常需要在程序中打开一些物理资源,
如数据库连接、网络连接、磁盘文件等,
打开这些物理资源之后必须显式关闭,否则将会引起资源泄漏。
作者: 苏伯亚    时间: 2014-4-1 10:20
本帖最后由 苏伯亚 于 2014-4-2 08:34 编辑

          JVM垃圾回收机制:Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。
         一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能
          Finally:Finally语句是为异常处理事件提供的一个清理机制,一般是用来关闭文件或释放其他系统资源。作为try-catch-finally结构的一部分,可以没有Finally语句,如果存在Finally语句,不论try块中是否发生异常,是否执行过catch语句,都执行finally语句这就是两者的作用。
         通俗讲finally只是为异常清理垃圾释放资源,而jvm则是释放运行的应用程序建立的所有对象,不能释放程序运行占用的资源。比如异常处理中因为报异常而没有停止运行的程序,这个时候JVM就不能释放这个错误程序占有的资源,而调用finally则可以选择关闭错误程序释放资源。希望可以帮助你。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2