【发布时间】:2020-03-20 00:07:43
【问题描述】:
让我们考虑以下代码:
class Table {
private static int number_of_Tables=0;
public Table(){
++number_of_Tables;
}
public void finalize(){
--number_of_Tables;
}
public static int current_TableCount(){
return number_of_Tables;
}
}
我想要实现的是,当垃圾收集器 (GC) 销毁对象时,可用对象的数量减少一。
但是这里关于finalize() 主题的每个人都说使用这种方法非常糟糕,因为可能会发生以下情况:即使没有指向对象的引用,GC 也可能不会立即销毁它,因为 GC 无法解决时钟,即 GC 将在一定数量的对象被销毁后被调用,即在特定时间 GC 将执行清理,这意味着即使对象不再可用,我的计数器也不会减少,我会给出错误调用方法curret_TableCount()时的信息
人们会做什么来确定地解决这类问题?
Java 中一定有某种解决方案?
编辑:我需要识别何时不再引用该对象,即在运行时甚至不存在一个指向该对象的指针(引用),当这是真的时,我会减少那种对象一个。
【问题讨论】:
-
我想你想要 PhantomReference。
-
我不知道这存在谢谢
-
另见
Cleaner(在 Java 9 中添加)。注意Object#finalize()was deprecated in Java 9. -
PhantomReference和Cleaner都不能解决垃圾收集器只在需要内存时才运行的普遍问题。如果您需要一个可靠的正在使用对象的计数器,您需要像close()或dispose()这样的方法,应用程序代码在使用该对象后必须调用该方法。您的代码还演示了为什么像finalize()这样看起来易于使用的方法是 Java 的一个巨大设计错误。finalize()方法将被未指定的线程调用(如果有的话),因此,需要将这样的计数器设为线程安全的。 -
在您获得关于使用什么的好答案之前,我们需要知道究竟为什么您想要更新
number_of_Tables?你对这些信息做什么。了解这一点将有助于我们了解是否有其他更好的方法。
标签: java garbage-collection static-members finalize