我想计算垃圾收集器调用我的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);
}
}
}
但是这段代码不起作用,甚至不好看。有什么聪明的方法呢?
答案 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;