JVM学习日志(九) 对象的finalization机制

简介: 对象的finalization机制 简述

对象的finalization机制

理解了GC Roots和引用类型的概念后,也就知道了那些对象可以被回收,那些对象那个不能回收

有GC Roots引用的对象不能回收,没有GC Roots引用的对象可以回收,如果有GC Roots引用,但是如果时软引用或者是弱引用,一样也可能会被回收

注意:如果没有GCRoots引用的对象,是不一定会被马上回收的,还可以通过Finalization机制来进行处理

如果对象重写了finalize()方法,如下面示例:这时候对象可以进行自我拯救

/**
 * @Author: DearSil
 * @Date: 2023/4/24 14:18
 * @Version: 1.0
 * @Description: 
 * 下面这段代码演示了两点
 * 1.对象可以在被GC的时候自我拯救
 * 2.着各种自救的机会只有一次,因为一个对象的finalize()方法最多只会被系统自动调用一次
 * 一个类可以重写finalize()方法,在方法里面自救或者做一些其他的事情,这个方法
 * 会在GC的时候被JVM自动调用
 */
public class TestFinalization {
   
    public static TestFinalization testFinalization;

    @Override
    protected void finalize() throws Throwable {
   
        System.out.println("当前的对象正在被回收,执行finalize()方法");
        testFinalization = this;
    }
}

注意:上述对象自救的机会只有一次,GC在回收对象的时候只会调用一次该对象的finalize()方法,第二次就直接清除了

注意

  • 永远不要主动调用某个对象的finalize()方法,应该交给GC来调用,理由有
    1. 在finalize()时可能会导致对象复活
    2. fingalize()方法的执行时间是没有保障的,他完全是由GC线程决定的,极端情况下,如果不发生GC,则finalize()方法将没有执行机会
    3. 一个糟糕的finalize()会严重影响GC的性能
  • 从功能上来说,finalize()方法会与C++中的析构函数比较类似,但是java采用的是基于垃圾回收器的自动内存管理机制,所以finalize()方法本质上不同于C++的析构函数
  • 其次他的运行代价高昂,不确定性打,无法保证各个对象的调用顺序,如今已经被官方明确声明为不推荐使用的语法,有些教材中描述它适合做“关闭外部资源”之类的请理性工作,这完全是对finalize()方法用途的一种自我安慰,finalize()能做的所有工作,使用try-finally或者其他的方法都可以做得更好更及时,所以建议大家可以忘掉这个方法
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
40 2
|
1月前
|
存储 算法 安全
【JVM】深入理解JVM对象内存分配方式
【JVM】深入理解JVM对象内存分配方式
29 0
|
1月前
|
存储 监控 Cloud Native
|
2月前
|
存储 算法 Java
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
54 1
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
|
29天前
|
存储 缓存 Java
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
37 1
|
2月前
|
Oracle Java 编译器
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
47 1
|
1天前
|
前端开发 Java 开发者
JVM类加载器的分类以及双亲委派机制
JVM类加载器的分类以及双亲委派机制
|
3天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs <container_name>` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
7 0
|
11天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
14 2
|
1月前
|
算法 Oracle Java
【JVM】了解JVM中动态判断对象年龄的原理
【JVM】了解JVM中动态判断对象年龄的原理
26 0