标签: finalize

Java Finalizer方法和GC

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

但是,当一个对象即将收集垃圾时调用finalize方法.这可以在它有资格进行垃圾收集之后的任何时间.

我不想要这个,我想在GC发生时立即调用finalize方法,并且不应该有任何延迟.有没有我可以设置的jvm选项来实现这个?我只能看到另一种方法是"System.runFinalization()",但这看起来很俗气?有更优雅的方式吗?

谢谢

java garbage-collection weak-references finalize

2
推荐指数
1
解决办法
288
查看次数

Java终结器的替代品

我正在使用 Mysql GET_LOCK在分布式系统中实现锁定服务。在调用我的 getLock() 方法时,如果客户端获得了锁,我会在数据库中创建一个条目并在释放锁时删除该条目。

假设调用客户端将在达到其目的后释放锁。但是,我想确保在客户端不释放它或不进行适当清理的情况下释放锁。

一种方法是在我的锁定对象上使用 finalize 方法以在调用 finalize 时释放它。然而,它并不理想,增加了复杂性并且在 Java 9 中被弃用。我读到了比终结器更好的 Phantom 引用,但它的复杂程度也很高。我把它作为我的最后手段。

有没有更简单、更少依赖 JVM 的方法来处理这个用例?

java garbage-collection phantom-reference finalize finalizer

2
推荐指数
1
解决办法
167
查看次数

关闭,处理,敲定,GC,Idisposable,....你有清楚的描述吗?

我对关闭,处理,敲定,GC,Idisposable完全感到困惑.哦,你能告诉我一个清楚的描述吗?

c# garbage-collection dispose idisposable finalize

1
推荐指数
1
解决办法
1433
查看次数

Java - 在程序结束时对象不是"垃圾回收"?

public class Main {

    public static void main(String[] args) throws InterruptedException {
        ClassA a = new ClassA();
        a = null;

        //Runtime.getRuntime().gc();
        Thread.sleep(4000);
    }
}

public class ClassA {

    @Override
    public void finalize(){
        System.out.println("cleaned");
    }  
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,finalize()永远不会执行.控制台上没有任何内容.从gc()中删除注释时,执行finalize(),并将"已清除"打印到控制台.为什么我必须明确地调用垃圾收集器?

java garbage-collection finalize application-shutdown

1
推荐指数
1
解决办法
564
查看次数

"using"语句中的灾难性故障,即使用(var a = new stream())和a.Something()会引发异常

所以我理解在using语句结束时,调用dispose方法.

如果我使用a会发生什么 'using(var a = new Stream()) { a.SomethingThrowsAnException() }'

流是否仍然通过他处理方法?

我写了一个实现IDisposable的类,它是关键任务,我不会丢失内存中的内容,因此我计划在发生灾难性事件时序列化数据,即我有一个像我正在使用的对象的自定义流.

有什么建议?

谢谢.

.net c# idisposable using finalize

1
推荐指数
1
解决办法
198
查看次数

在C#中正确配置对象层次结构

我正在开发一个项目,其中某个类层次结构实现IDisposable.

一些类还实现了Finalize方法(~MyClass())

一般来说,它看起来像这样:

public class BaseClass : IDisposable
{
}

public class SomeClass : BaseClass
{
    ~SomeClass()
    {
        Dispose();
    }

    Dispose()
    {
        // Do some stuff.
        base.Dispose();
    }
}

public class AnoterClass : SomeClass
{
    ~AnoterClass()
    {
        Dispose();
    }

    Dispose()
    {
        // Do some stuff.
        base.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道处理Dispose调用的正确方法是什么,因为看起来这些对象是通过调用Dispose()来处理的,后来因为Finalize方法被调用而崩溃了.

是否最好在层次结构中保留一个标志(保护bool处置),并检查类层次结构的每个级别?

我发现每个可能的解决方案都需要一些代码重复,这不是我想要的.

.net c# dispose idisposable finalize

1
推荐指数
1
解决办法
939
查看次数

为什么没有调用finalize()?

我想用finalize检查终止条件,但每次都不会执行finalize.谁能告诉我为什么?

public class Test
{

    public static void main(String[] args)
    {   
        Tank tank=new Tank();
        tank.fill();
        System.gc();
    } 
}  
public class Tank    {

    private boolean emptied=true;

    public void fill()
    {
        this.emptied=false;
    }

    public void empty()
    {
        this.emptied=true;
    }

    public Tank()
    {
        this.emptied=true;
    }

    protected void finalize()
    {
        if(this.emptied==false)
        {
            System.out.println("Termination Verification Error: Tank should be emptied");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java finalize

1
推荐指数
1
解决办法
774
查看次数

-1
推荐指数
1
解决办法
2万
查看次数