当前位置: 技术问答>java相关
java有没有"析构"函数呢?
来源: 互联网 发布时间:2015-02-18
本文导语: 对于一个java类,可以使用其构造函数来初始化其参数, 一个类实例出了在其作用范围后系统将释放其资源, 请问java可不可以写一个函数让类实例被销毁时系统自动调用呢? 就象C++中的"析构"函数一样? 谢谢. | ...
对于一个java类,可以使用其构造函数来初始化其参数,
一个类实例出了在其作用范围后系统将释放其资源,
请问java可不可以写一个函数让类实例被销毁时系统自动调用呢?
就象C++中的"析构"函数一样? 谢谢.
一个类实例出了在其作用范围后系统将释放其资源,
请问java可不可以写一个函数让类实例被销毁时系统自动调用呢?
就象C++中的"析构"函数一样? 谢谢.
|
析构除了可被用来释放内存资源之外,还可以用来释放其他资源,如socket资源,
thread资源/同步信号资源,文件资源,硬件资源。。。等。
好象只有finalize()方法会在该object被GCed的时候被系统自动调用。但何时
不保证(比如GC很晚才发生或根本没发生),由哪个线程出手来调用finalize()
也不规定,。。。故finalize()不是非常可靠的方法。
比较可靠的方法是自己写close方法,并在把该object设为null之前,自己主动地在
一个合适的线程里调用这个close方法
thread资源/同步信号资源,文件资源,硬件资源。。。等。
好象只有finalize()方法会在该object被GCed的时候被系统自动调用。但何时
不保证(比如GC很晚才发生或根本没发生),由哪个线程出手来调用finalize()
也不规定,。。。故finalize()不是非常可靠的方法。
比较可靠的方法是自己写close方法,并在把该object设为null之前,自己主动地在
一个合适的线程里调用这个close方法
|
当你的程序有大量耗时运算,或主机环境有别的程序抢占cpu资源,以使你的jvm没有cpu时间片来运行垃圾收集线程(该线程优先级最低),就会有我和hahaha88兄的情况。
你的程序没有大量计算,或你的计算机较快所以每次都成功。因为system.gc()并不是直接启动垃圾收集,所以就算有影响,也不会有很多的性能损失。
本来finialize()就是用来给你释放某些外部资源的。比如,你用jni,其中分配了内存,那么内存的释放就可以放在finialize()(参见thinking in java)。
你的程序没有大量计算,或你的计算机较快所以每次都成功。因为system.gc()并不是直接启动垃圾收集,所以就算有影响,也不会有很多的性能损失。
本来finialize()就是用来给你释放某些外部资源的。比如,你用jni,其中分配了内存,那么内存的释放就可以放在finialize()(参见thinking in java)。