AutoCloseable和垃圾收集关系

时间:2016-05-20 10:38:05

标签: java garbage-collection

所以我已经阅读了关于autocloseable接口的所有内容并尝试使用资源,但这让我感到奇怪:

如果我没有(忘记)在使用该类的代码中尝试使用资源尝试包装实现AutoCloseable的类会发生什么,但该类确实从操作系统获取资源? 虽然不能保证JVM何时会决定调用它的垃圾收集器,但是当它调用它时,是否会调用close()方法?

如果没有,这是否会让我想念C ++的析构函数? :) 有没有类似的方法来确保从该类的代码而不是用户的代码中,一旦该对象应该被释放(例如超出范围),它将释放所有的OS资源已经采取了?

2 个答案:

答案 0 :(得分:3)

取决于课程。有些人实现了在GC收集对象时调用的finalize()方法,并且调用了close();,但它无法保证。

请注意,虽然你可能会想到#ye; yeehaw,但Java确实有析构函数!"它不是一回事,并且你不建议你开始在你自己的课程中实现finalize()(我记不起在我16年的Java编程中写一篇)。

当您忘记关闭资源时,您已经犯了错误,所以要修改它。使用AutoCloseable它比过去更方便。

答案 1 :(得分:1)

您无需添加任何此类文档。只需将其设为CloseableAutocloseable,每个人都会知道。最多,在用于获取实例的方法/构造函数中添加一条简短的注释“不要忘记调用close()”。

  

如果没有,这是否会让我想念C ++的析构函数?

当然,你会想念他们。 Java中没有真正的替代品。 finalize()和朋友们相当无法使用。在GC启动之前,您可能已经耗尽资源(文件描述符或类似文件)。

您可以使用finalize()或类似内容来打印警告。如果对象在没有被关闭之前得到了GC,那就是资源泄漏。

有静态分析工具可以标记非封闭资源。不知道,如果他们使用自定义对象,但我敢打赌,他们会查看实现(自动)可关闭的所有类。