Java相当于GC.SuppressFinalize

时间:2014-05-22 04:40:25

标签: java .net garbage-collection finalizer

Java是否具有相同的.Net' s GC.SuppressFinalize

在.Net中,只要明确处理了对象,就会在dispose pattern中使用SuppressFinalize来避免relatively high performance cost的终结。类似的成本适用于Java,但它似乎没有SuppressFinalize。

我知道通常最好完全避免使用终结器,但我不认为我可以为我的特定用例避免使用它们(取消令牌,您可以添加只在另一个用户运行的处理程序)令牌首先没有被取消,因此由于收集源而使令牌变为不朽必须导致从链接的令牌中删除条目,以免它们累积垃圾条目而不受束缚)。

Java中是否有相应的SuppressFinalize?如果没有,可以使用可用的工具(例如ReferenceQueue)来近似吗?

2 个答案:

答案 0 :(得分:1)

没有本地" GC.SuppressFinalize" Java的方法。但IDiposable模式对您来说很有用。

当您知道不再需要某件商品时,您可以手动处理该商品 能够运行清理代码以安全地关闭连接,关闭文件等。您也会这样做 能够使用终结器来捕捉何时应该清理对象的情况。

答案 1 :(得分:1)

我已经想出了一个可能的解决方法,因为在避免终结器的成本方面,在Java中没有等效的东西:使用缓存。

  1. 拥有一个具有可更改回调成员的对象:

    public final class Finalizer {
      public Runnable onFinalizer;
      @Override
      protected void finalize() {
        if (onFinalizer != null) {
          onFinalizer.run();
        }
      }
    }
    
  2. 收集它们:

    Stack<Finalizer> finalizerCache = new Stack<>();
    
  3. 需要时抓住:

    this.finalizer = finalizerCache.isEmpty() ? new Finalizer() : finalizerCache.pop();
    this.finalizer.onFinalizer = () -> { my special cleanup code; };
    
  4. 需要时丢弃:

    void cancel() {
      this.finalizer.onFinalizer = null;
      if (finalizerCache.size() < 100) {
        finalizerCache.push(this.finalizer);
      }
      this.finalizer = null;
    }
    
  5. 显然,可能会有很多与缓存大小及其同步方式有关的调整,但这应该是一种有用的方法,可以避免在终结器很少运行的情况下终结器的成本。 #39;在需要最终确定的对象总数中没有太多的流失。