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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 对象的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日志并进行多维度分析。
目录
相关文章
|
18天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
43 3
|
1月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
25 3
|
1月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
135 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
1月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
31 0
|
14天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
125 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
227 3
|
3月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
131 3
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1634 14