gpt4 book ai didi

java - 应用程序关闭时 JVM 垃圾收集器是否运行?

转载 作者:行者123 更新时间:2023-11-30 06:54:45 25 4
gpt4 key购买 nike

我对终结器如何在 JVM 中工作(来自此处和互联网上的多个来源的垃圾收集)感到非常困惑。

据我了解,通常的方法是不依赖终结器来执行清理,因为无法保证何时它们将被调用,或者如果应用程序完成,它们是否会被调用。然而,我仍然希望当应用程序完成并且所有对象不再存在时调用它们,只要应用程序还活着。

在我的特定情况下,我有一个应用程序,其中的类可打开与另一个资源的连接。

简化后我们会有

public class MyClass {

Connection connection = new Connection();

public MyClass() {
connection.open();
}

public void close() {
connection.close();
}

@Override
protected void finalize() {
connection.close();
}
}

public class Main {
public static void main(String[] args) {
MyClass instance = new MyClass();

// If I call instance.close(), application ends when it reaches end of main method
// instance.close()

// If not called, application will not end.

}
}

注意“MyClass”的封装目的,调用代码不一定需要知道(也不需要)他正在使用非托管资源。

发生的情况是应用程序永远运行,我假设挂起在打开的连接上而没有释放它,因为 GC 没有被调用(并且永远不会被调用,因为没有真正的内存压力)。

如果应用程序完成时调用GC,是否有办法保证应用程序完成时关闭非托管资源(连接)?显然无需显式调用 close。

我已经看到了 AutoClosable 接口(interface),这绝对是一个选项,但它仍然不能保证应用程序完成时连接最终会被断开。

最佳答案

If the GC is not called when the application finishes, is there a way to guarantee the non managed resource (the connection) is closed when the application finishes? Obviously without having to explicitly call close.

如果你调用(在 Unix 上)

kill -9 {pid}

进程立即终止而不通知进程。例如,没有调用finally block 。您无法采取任何措施来阻止这种情况。

您可以使用 runFinalizersOnExit 启用在正常关闭时调用终结器,但仅在正常关闭时调用。

顺便说一句,如果你拔掉电源或网络连接,你也不会正常断开连接,所以你无法避免需要处理这个问题,你所能做的就是在正常的 close()/shutdown 上进行清理.

关于java - 应用程序关闭时 JVM 垃圾收集器是否运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42067763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com