我有一个java类,它使用复杂的静态字段,需要close()
的特殊操作,以便GC安全地清除它们。
对于静态字段的初始化,我使用static
块。但我现在不知道如何安全地卸载静态字段,这样我就可以在GC清理字段之前调用close()
方法。
有没有办法卸载静态字段,类似于静态初始化块?
答案 0 :(得分:8)
没有办法做你要求的事情,因为静态块在加载类时被初始化,而finalize()仅适用于对象。
考虑使用Singleton类及其实例替换静态变量及其中的复杂操作。
这样,您就可以使用finalize()
方法执行close()
操作。
答案 1 :(得分:3)
private static Uninit cleanup = new Uninit();
....
private static class Uninit {
public Uninit() {}
public void finalize() {
//whatever you need done
}
}
答案 2 :(得分:2)
在网络应用中,您可以使用ServletContextListener。
答案 3 :(得分:1)
您可以设置shutdown hook来完成此操作,但您可能无法完成所有操作。您可能已经耗尽了内存,或者该过程可能已经被杀死而没有它有机会进行清理等等。
最好确保数据一致性不依赖于此代码和/或将其移动到在应用程序生命周期内定期清理的代码。
答案 4 :(得分:-2)
没有。
静态类在您第一次使用时会在运行时加载,并且只在程序退出时才会卸载(afaik)。
所以你可以在类本身中创建一个静态方法close
来清理静态成员,并在你退出时调用它。