小弟写了一个类很简单:
public class FiscnApp
{
public void initialize() 
{
System.out.println("initialize"); }
public void unInitialize() 
{
System.out.println("unInitialize");
}
}
如何在类销毁前执行unInitialize方法?
小弟用finalize发现他不一定被执行,加上System.runFinalizersOnExit(true)也有问题
(继承Runable接口需要new Thread, 也不符合要求)
不知道各位大侠有好办法没有?

解决方案 »

  1.   

    应该重写Object类finalize()方法就可以了吧
      

  2.   

    一个实例被垃圾回收的时候,一定会调用finalize方法
    如果没有调用,说明这个实例没有被垃圾回收,也就是没有被销毁
    你可以试试在做销毁操作前,先把这个实例置为null,确保没有其他地方对它有引用
      

  3.   

    看看Pitfalls中的对象引用。重写finalize可以解决问题。
      

  4.   

    重载FINALIZE方法可以解决问题
      

  5.   

    那为什么unInitialize总打印不出
      

  6.   

    不是所有的java对象所占据的存储空间都一定会被垃圾收集器收集,即使没有任何引用指向这个对象,它也有可能一直到你机器重启为止都没有被垃圾回收器收集,finalize()起作用的前提是对象确实被作为垃圾回收了;因为这个对象回不回收,什么时候回收是JAVA虚拟机说了算的,所以,finalize()方法无法保证每次在你测试的时候都起作用。
    我的结论是你的需求可能没法满足,因为JAVA不像其它语言比如C++,程序员有对占用释放内存的绝对控制权。
    关注其他问答!
      

  7.   

    不是不对,是JAVA本身的机制决定的,即使你显式的FiscnApp  f=null;原先对象占用的内存还在,虚拟机不回收,你有什么办法?
    不知道servlet的destroy()方法是个什么机制?
      

  8.   

    你写的那个又没有被调用怎么打印啊
    unInitialize可以打印出,重写finalize()方法,然后在finalize()方法内调用unInitialize()方法
    再System.gc();让JVM尽快回收不被引用的对象public class FinalizeTest { public static void main(String[] args) {
    new FinalizeTest();
    System.gc();
    } public void finalize() {
    unInitialize();
    } public void unInitialize() {
    System.out.println("unInitialize");
    }
    }
      

  9.   

    首先要是想销毁的对象的引用全设为null,
    也就是保证没有变量引用它,
    然后等jvm自动回收它,或者手动调用System.gc()通知垃圾回收器回收垃圾
    这时在回收对象前才会调用finalize方法
      

  10.   

    即使System.gc(),也无法保证一定执行!
      

  11.   

    System.gc();是不一定能保证
    只是suggests that the Java Virtual Machine expend effort toward recycling unused objects
    没有可以强制JVM进行垃圾回收的方法