第3讲 谈谈final、finally、 finalize有什么不同?

参考

三者区别

final

  • final 是 java 关键字
  • 可修饰变量(类成员变量、类静态变量、局部变量和形参):表示不可修改当前变量的值(这里的值可以是地址,也可以是基本类型的值)#(注意:final只是限定当前变量的值,并不会限制引用对象的增删改查)#
  • 可修饰方法:表示方法不可以被重写(Override),可以修饰private、static修饰的方法
  • 可修饰类:表示当前类不可以被继承(较多的基本类型的引用类型都是final修饰的)
  • final 还可以提升性能:从并发角度分析#后续分析#

finally

  • java 关键字,是一种能够保证代码一定被执行的机制,当然也有两种情况不会执行:
    • try 未被执行
    • 在finally之前执行了 System.exit(0) 语句,强制退出

finalize

  • java 关键字
  • 是Object类中定义的方法
  • 主要用于垃圾回收

为啥 finalize不推荐使用

  • 垃圾回收主要根据可达性分析,判断一个对象是否可以被回收,当一个对象被判定为从GC ROOT不可达,也并非一定被回收。因此对象被回收需要经历两次标记过程,才会判断一个对象是否需要真正被回收

    总结:如果对象未实现 finalize 方法,在经历第二次标记后,会被判定为直接回收,另外,finalize方法并不保证一个对象一定被回收

两次标记:

  • 第一次标记:该对象从GC ROOT不可达(或者说不存在GC ROOT引用链)

  • 第二次标记:就会判断该对象是否实现或者被调用 finalize 方法

    • 如果确定该队形一定要执行 finalize 方法,首先将该对象添加进F-队列中
    • 然后收集器会对F-队列中的对象再次进行标记,如果该对象在执行finalize方法的时候,被其他GCRoot可达的对象引用,该对象就不会被回收

调用finalize方法,对象一定被回收吗?

  • 被添加到F队列的对象,稍后虚拟机自动建立低优先级的回收线程执行finalize方法(这里的执行只是表示开始执行**#finalize#**,由于极端对象由于死循环、执行慢的情况,会导致队列中的其他对象一直处于等待场景,因此,并不保证 finalize 执行完成)
  • 如果对象在 finalize 方法中被其他GCRoot可达的对象引用,该对象就不会被回收

了解Cleaner机制(后续补充)

finally 和 Return 的执行顺序

相关推荐
历程里程碑12 分钟前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
程序员泠零澪回家种桔子31 分钟前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
CodeCaptain39 分钟前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
Anastasiozzzz2 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人2 小时前
通过脚本推送Docker镜像
java·docker·容器
铁蛋AI编程实战2 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘2 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
马猴烧酒.2 小时前
【面试八股|JVM虚拟机】JVM虚拟机常考面试题详解
jvm·面试·职场和发展
SunnyDays10112 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
摇滚侠2 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea