首先,请记住,不能保证您的所有对象都会运行最终确定。您可以使用它来释放在与对象关联的本机代码中分配的内存,但对于纯 Java 代码,大多数用例仅用于执行清理资源的“备份”机制。这意味着在大多数情况下,您应该手动释放资源,如果您忘记以标准方式进行清理,终结器只能充当一种清理助手。但是,您不能将它们用作唯一或主要的清理机制。更一般地说,您不应该编写任何正确性取决于正在运行的终结器的代码。
广告 1. 据我所知,无法保证线程调用的内容finalize()
,但实际上这可能是 GC 线程之一。
广告 2. 允许实例化新对象。但是,在终结器中处理对象引用存在许多缺陷。特别是,如果您在某个活动对象中存储对正在完成的对象的硬引用,则可以防止您的即将被垃圾收集的对象被清理。如果失去控制,这种对象复活可能会导致您的资源耗尽。此外,请注意异常finalize()
- 它们可能会停止最终确定,但您的程序没有自动方式来了解它们。您需要将代码包装在 try-catch 块中并自己传播信息。此外,终结器的较长执行时间可能会导致对象队列堆积并消耗大量内存。其他一些值得注意的问题和限制在这篇 JavaWorld 文章。
广告 3. 从终结器调用静态方法应该没有任何问题。
广告 4. 如第 2 点所述,可以通过在终结期间将对它的引用放置在另一个活动对象中来防止对象被垃圾收集(以复活它)。但是,这是一种棘手的行为,可能不是好的做法。
总而言之,你不能依赖终结器来清理你的资源。您需要手动处理该问题,并且在您的情况下,终结器最多只能用作备份机制,以在某种程度上马虎编码后进行掩盖。不幸的是,这意味着您通过使用终结器清理 OpenGL 资源来使 API 更好的想法可能行不通。