AutoCloseable 和垃圾回收的关系

Yon*_*ren 5 java garbage-collection

所以我已经阅读了有关自动关闭界面的所有内容并尝试使用资源,但这让我想知道:

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

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

maa*_*nus 4

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

如果没有,我会怀念 C++ 的析构函数吗?

当然,您会想念他们的。Java 中没有真正的替代品。finalize()而朋友则相当无用。在 GC 启动之前,您可能早已耗尽资源(文件描述符等)。

您可以使用finalize()或类似的方法来打印警告。如果对象在之前没有被关闭的情况下被 GC 回收,那么就会发生资源泄漏。

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