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或者其他的方法都可以做得更好更及时,所以建议大家可以忘掉这个方法
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
7月前
|
Arthas 监控 Java
Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
478 16
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
818 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
缓存 Java
JVM对象引用
本次课程聚焦JVM对象引用,涵盖强引用、软引用、弱引用和虚引用。强引用是最常见的引用类型,确保对象不会被垃圾回收器回收,适用于需要确保对象存活的场景;软引用在内存不足时会被优先回收,常用于缓存;弱引用的对象随时可能被回收,适合临时对象;虚引用最弱,主要用于接收对象回收通知,进行资源清理。通过合理选择引用类型,可优化内存管理,避免内存泄露。
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
283 4
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
1443 3
|
7月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
740 55
|
2月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
285 5
|
2月前
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
8月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
730 6