我创建了一个对象,其finalize方法已被覆盖,以保存和关闭具有一些信息的文件.该对象是从另一个对象引用的弱对象.我希望在GC发生时保存对象的一些更改.这就是为什么我覆盖了finalize的代码.
但是,当一个对象即将收集垃圾时调用finalize方法.这可以在它有资格进行垃圾收集之后的任何时间.
我不想要这个,我想在GC发生时立即调用finalize方法,并且不应该有任何延迟.有没有我可以设置的jvm选项来实现这个?我只能看到另一种方法是"System.runFinalization()",但这看起来很俗气?有更优雅的方式吗?
谢谢
我正在使用 Mysql GET_LOCK在分布式系统中实现锁定服务。在调用我的 getLock() 方法时,如果客户端获得了锁,我会在数据库中创建一个条目并在释放锁时删除该条目。
假设调用客户端将在达到其目的后释放锁。但是,我想确保在客户端不释放它或不进行适当清理的情况下释放锁。
一种方法是在我的锁定对象上使用 finalize 方法以在调用 finalize 时释放它。然而,它并不理想,增加了复杂性并且在 Java 9 中被弃用。我读到了比终结器更好的 Phantom 引用,但它的复杂程度也很高。我把它作为我的最后手段。
有没有更简单、更少依赖 JVM 的方法来处理这个用例?
java garbage-collection phantom-reference finalize finalizer
我对关闭,处理,敲定,GC,Idisposable完全感到困惑.哦,你能告诉我一个清楚的描述吗?
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(),并将"已清除"打印到控制台.为什么我必须明确地调用垃圾收集器?
所以我理解在using语句结束时,调用dispose方法.
如果我使用a会发生什么 'using(var a = new Stream()) { a.SomethingThrowsAnException() }'
流是否仍然通过他处理方法?
我写了一个实现IDisposable的类,它是关键任务,我不会丢失内存中的内容,因此我计划在发生灾难性事件时序列化数据,即我有一个像我正在使用的对象的自定义流.
有什么建议?
谢谢.
我正在开发一个项目,其中某个类层次结构实现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处置),并检查类层次结构的每个级别?
我发现每个可能的解决方案都需要一些代码重复,这不是我想要的.
我想用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) 通常这些关键字让我感到困惑.
谁能告诉我他们到底有什么区别?