【问题标题】:Java Finalizer Method and GCJava 终结器方法和 GC
【发布时间】:2012-09-17 17:54:00
【问题描述】:

我创建了一个对象,该对象的 finalize 方法已被覆盖,以保存和关闭包含一些信息的文件。该对象被另一个对象弱引用。我想在 GC 发生时保存对对象的一些更改。这就是为什么我覆盖了 finalize 的代码。

但是,当一个对象即将被垃圾回收时,会调用 finalize 方法。这可以在它符合垃圾收集条件之后的任何时间。

我不想要这个,我想GC一发生就调用finalize方法,不应该有任何延迟。我可以设置任何 jvm 选项来实现这一点吗? 我只能看到另一种方式是“System.runFinalization()”,但这似乎很俗气?? 有没有更优雅的方式?

谢谢

【问题讨论】:

  • 也许你看看这个问题:stackoverflow.com/questions/2506488/…
  • 依赖finalize 做应用程序逻辑从来都不是一个好主意。您将需要在您认为不再需要该对象的地方手动执行代码。最重要的原因是finalize可能根本不会被调用。

标签: java garbage-collection weak-references finalize


【解决方案1】:

我想在 GC 发生后立即调用 finalize 方法,

你不能不使用我不建议你使用的内部 API。

不应该有任何滞后。

总是有滞后。仅关闭文件将花费数毫秒。发生这种情况时应用程序冻结是否可以(因为在 GC 运行时应用程序可能会冻结)

有没有更优雅的方式?

如果您想确定性地发生,请在完成后关闭资源。

【讨论】:

  • +1 "如果您想确定性地发生,请在完成后关闭资源。"
  • 为此 +1。直接处理就行了;不要试图破解完成。
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 2014-03-13
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2013-10-29
  • 1970-01-01
相关资源
最近更新 更多