finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

Java中的finalize()方法在垃圾回收器决定回收对象时被调用,作为对象最后的清理机会。它通常用于执行资源释放,如关闭文件、释放内存等。然而,由于执行的不确定性,不推荐依赖finalize()进行关键资源的清理,而是应使用try-finally或其他机制。finalization的主要目的是让对象有机会自救,重新与引用链建立连接以避免被回收。

finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
链接:https://www.nowcoder.com/questionTerminal/d8eab06913084e42b515633604eef7cd?pos=28&mutiTagIds=570&orderByHotValue=0&done=0
来源:牛客网

参考:《深入理解Java虚拟机》
对于Java而言:
调用时机:当垃圾回收器要宣告一个对象死亡时,至少要经过两次标记过程:如果对象在进行可达性分析后发现没有和GC Roots相连接的引用链,就会被第一次标记,并且判断是否执行finalizer( )方法,如果对象覆盖finalizer( )方法且未被虚拟机调用过,那么这个对象会被放置在F-Queue队列中,并在稍后由一个虚拟机自动建立的低优先级的Finalizer线程区执行触发finalizer( )方法,但不承诺等待其运行结束。
finalization的目的:对象逃脱死亡的最后一次机会。(只要重新与引用链上的任何一个对象建立关联即可。)但是不建议使用,运行代价高昂,不确定性大,且无法保证各个对象的调用顺序。可用try-finally或其他替代。

1)垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法; 2)GC本来就是内存回收了,应用还需要在finalization做什么呢? 答案是大部分时候,什么都不用做(也就是不需要重载)。只有在某些很特殊的情况下,比如你调用了一些native的方法(一般是C写的),可以要在finaliztion里去调用C的释放函数。

### C++ 析构函数调用时序 在 C++ 中,析构函数会在对象生命周期结束时自动调用。具体来说,当一个对象超出其作用域或者被显式删除时,对应的析构函数会被触发[^1]。对于动态分配的对象(通过 `new` 创建),只有在其被 `delete` 显式释放时才会调用析构函数。 如果对象是一个局部变量,则在该变量的作用域结束时会自动调用析构函数。此外,在 RAII(Resource Acquisition Is Initialization)模式下,资源管理类的析构函数会在对象销毁时负责清理所持有的资源[^3]。 以下是关于析构函数调用顺序的一些重要规则: - 如果是栈上对象,按照后进先出的原则依次调用析构函数。 - 对于继承关系中的基类和派生类组合,析构函数按从最底层派生类到顶层基类的顺序逐层调用。 ```cpp class Base { public: ~Base() { std::cout << "Base destructor called\n"; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor called\n"; } }; void exampleFunction() { Derived d; } // 当离开此作用域时,首先调用 Derived 的析构函数,接着调用 Base 的析构函数。 ``` ### Java 析构函数等价机制 Java 并未提供像 C++ 那样的明确析构函数支持,而是依赖垃圾回收器 (Garbage Collector, GC) 来处理不再使用的对象。然而,可以通过实现 `finalize()` 方法来定义一些类似于析构的行为[^2]。需要注意的是,`finalize()` 方法并不保证一定会被执行,并且它的执行时间也不可控,因为这完全取决于 JVM 垃圾收集的具体策略。 由于上述原因,在实际开发中推荐使用 try-with-resources 或者手动关闭资源的方式来替代 finalize 方法完成必要的清理工作。 ### 对象销毁周期 无论是 C++ 还是 Java,都遵循一定的原则去管理和终止对象的生命期: #### 在 C++ 中, - 自动存储持续时间的对象在其声明范围之外立即销毁; - 动态分配的对象仅在程序员调用了 delete 后才销毁; - 局部静态对象在整个程序运行期间保持有效直到应用程序退出为止; #### 在 Java 中, - 只要某个对象无法再访问,就成为候选被清除的目标; - 实际销毁发生的时间由 Garbage Collection 决定而不是固定时刻。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值