Java finalize()调用计数

时间:2013-12-04 12:16:48

标签: java oop garbage-collection finalizer

我想计算垃圾收集器调用我的finalize方法的次数,但我不知道如何实现全局变量来执行此操作。我试过这种方式:

class ObjMaker {

    int obj_nr;

    ObjMaker(int obj_nr){
        this.obj_nr = obj_nr;
    }

    protected void finalize(){
        Global.finalize_counter += 1;
    }
}

public class Global{
    public int finalize_counter = 1;
}

class FinalizeSimpleDemo{
    public static void main(String args[]){

        for(int i = 1; i <= 10000000; i++){
            ObjMaker ob = new ObjMaker(i);
        }
    }
}

但是这段代码不起作用,甚至不好看。有什么聪明的方法呢?

2 个答案:

答案 0 :(得分:3)

您需要将finalize_counter作为static变量。只有这样,您才能使用ClassName访问它。此外,任何实例变量只能通过类的实例访问。

public class Global{
    static int finalize_counter = 1; // make it static
}

但请注意,JVM实现控制何时运行finalize。通常,在对象被垃圾回收时调用finalize()方法,因此,如果没有执行垃圾回收,则可能根本不会调用finalize()

答案 1 :(得分:1)

这不是一个诚实的尝试,因为你的finalize()可能永远打电话,因为如果这是唯一正在运行的程序。 JVM不会打扰垃圾收集。

如果您真的想要计算这是否会收集为垃圾,您应该使用static变量。

   public static int finalize_counter = 1;