首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中finalize方法

Java中finalize方法

作者头像
全栈程序员站长
发布于 2022-11-04 13:33:46
发布于 2022-11-04 13:33:46
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

前沿:在面试过程中我们可能会被问到final、finally、finalize的区别?本篇文章将介绍finalize的简单用法。

  • Finalize()是Object类的方法。
  • 在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。
  • finalize()方法将重写以处理系统资源,执行清理活动并最大程度地减少内存泄漏。
  • 简单来说可在释放对象前进行某些操作。

代码举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FinalizeTest { 

public static void main(String[] args) { 

Student student = new Student("YuShiwen",21);
System.out.println(student);
student = null;//此时对象实体就是垃圾对象,等待被回收。但时间不确定。
System.gc();//强制性释放空间
}
}
class Student{ 

private String name;
private int age;
public Student(String name, int age) { 

this.name = name;
this.age = age;
}
public String getName() { 

return name;
}
public void setName(String name) { 

this.name = name;
}
public int getAge() { 

return age;
}
public void setAge(int age) { 

this.age = age;
}
@Override
public String toString() { 

return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//子类重写此方法,可在释放对象前进行某些操作
@Override
protected void finalize() throws Throwable { 

super.finalize();
System.out.println("进行某些操作!");
}
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student{name='YuShiwen', age=21}
进行某些操作!
Process finished with exit code 0

垃圾回收机制关键点:

  • 垃圾回收机制只回收JVM堆内存里的对象空间。
  • 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力
  • 现在的JVM有多种垃圾回收实现算法,表现各异。
  • 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
  • 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
  • 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有 一些效果,但是系统是否进行垃圾回收依然不确定。
  • 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一 个新的引用变量重新引用该对象,则会重新激活对象)。
  • 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191683.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月19日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
第三阶段-Java常见对象:【第八章 System类】
System.gc() 可用于垃圾回收.当使用System.gc() 回收某个对象所占用的内存之前,通过要求程序调用适当的方法来清理资源,在没有明确指定资源清理的情况下,Java提高了默认机制来清理该对象的资源,就是调用object类的finalize()方法,finalize()方法的作用是释放一个对象占用的内存空间时会被JVM调用.而子类重写该方法, 就可以清理对象占用的资源,该方法没有链式调用, 所以必须手动实现。
BWH_Steven
2019/08/09
4240
疯狂Java笔记之Java的内存与回收
对于JVM的垃圾回收机制来说,是否回收一个对象的标准在于:是否还有引用变量引用改对象?只要有引用变量引用对象,垃圾回收机制就不会回收它。
HelloJack
2018/08/28
4750
疯狂Java笔记之Java的内存与回收
一文带你了解Java 中的垃圾回收机制
根据我们的要求,我们可以覆盖finalize() 方法来执行我们的清理活动,例如关闭数据库连接。
海拥
2021/09/26
5710
一文带你了解Java 中的垃圾回收机制
【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )
在 堆内存 中 , 存在一个 根对象 GC Root , GC Root 对象一般是如下几种情况 :
韩曙亮
2023/03/29
6950
【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )
一篇文章带你了解Java选择排序和垃圾回收机制
前面几篇文章用Java带大家一起了解了几个游戏小项目,感兴趣的小伙伴可以点击文章观摩下,手把手教你用Java打造一款简单故事书(上篇)、手把手教你用Java打造一款简单故事书(下篇)、手把手教你用Java打造一款简单考试系统(上篇)、手把手教你用Java打造一款简单考试系统(下篇)、手把手带你用Java打造一款对对碰游戏(上篇)、手把手带你用Java打造一款对对碰游戏(下篇)、手把手带你用Java实现点灯游戏(上篇)、手把手带你用Java实现点灯游戏(下篇),接下来的几篇文章是关于Java基础的,希望对大家的学习有帮助,欢迎大家在讨论区留言。
Java进阶者
2021/01/22
4090
Java Review (十八、面向对象----对象与垃圾回收)
Java 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭;因此这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。
三分恶
2020/07/16
5260
Object 类和垃圾回收机制
如果在类的声明中未使用 extends 关键字指明其基类,则默认基类为 Object 类
帅飞
2019/01/22
4430
java小心机(3)| 浅析finalize()
本例的终结条件是:所有的Book对象在被当作垃圾回收前都应该被签入(check in)。 在main()方法中可看到,一次误操作未对Book对象进行签入,导致有一本书没有被签入。此时我们可以使用finalize()验证终结条件。
KEN DO EVERTHING
2019/01/17
3900
finalize方法_final与finalize区别
当对象没有引用指向时,虚拟机会按照一定的垃圾回收机制算法来调用finalize方法将该对象回收,并不是只要没有引用对象就会被回收。
全栈程序员站长
2022/11/04
2420
object finalized_finalize()方法
首先finalize方法是在垃圾回收时,用于确认该对象是否确认被回收的一个标记过程。
全栈程序员站长
2022/10/02
2100
Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢它这一点。但是不得不说它设计的很优秀也很流行。
Masimaro
2019/05/15
4200
Java内存管理(二、Java垃圾回收)
二、Java垃圾回收 1. JVM运行环境中垃圾对象的定义      一个对象创建后被放置在JVM的堆内存中,当永远不再引用这个对象时,它将被JVM在堆内存中回收。或  当对象在JVM运行空间中无法通过根集合(root set)到达时,这个对象就被称为垃圾对象。 2. 堆内存 * 在JVM启动时被创建;堆内存中所存储的对象可以被JVM自动回收,不能通过其他外部手段回收 * 堆内存可分为两个区域:新对象区和老对象区     -- 新对象区可分为三个小区:Eden区、From区、To区     Eden区用来保存新创建的对象,当Eden区中的对象满了之后,JVM将会做可达性测试,检测有哪些对象由根集合出发是不可达的,不可达的对象就会被 JVM回收,并将所有的活动对象从Eden区拷到To区,此时一些对象将发生状态交换,有的对象就从To区被转移到From区。 3. JVM中对象的生命周期 * 创建阶段(步骤)     -- 为对象分配存储空间     -- 开始构造对象     -- 递归调用其超类的构造方法     -- 进行对象实例初始化与变量初始化     -- 执行构造方法体 * 应用阶段     -- 特征:系统至少维护着对象的一个强引用;所有对该对象引用强引用(除非显示声明为其它引用)     -- 强引用       指JVM内存管理器从根引用集合出发,遍寻堆中所有到达对象的路径。当到达某对象的任意路径都不含有引用对象时,对这个对象的引用就被称为强引用。 当内存不足时,JVM宁愿抛出OutOfMemeryError错误使程序停止,也不会靠收回具有强引用的对象来释放内存空间     -- 软引用       它能实现cache功能,防止最大限度的使用内存时引起的OutOfMemory异常,在内存不够用的时候jvm会自动回收Soft Reference。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,java虚拟机就会把这个软引用加入到与之关联的引用队列中。       Java中提供软引用的包:java.lang.ref.SoftReference(后续详解)      软引用       实现cache功能,防止最大限度的使用内存时引起的OutOfMemory异常,在内存不够用的时候jvm会自动回收Soft Reference.软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
bear_fish
2018/09/20
5210
Java学习笔记-全栈-Java基础-05-垃圾回收与内存泄漏
任何一种垃圾回收算法一般要做两件基本事情:   1. 发现无引用对象   2. 回收该对象占用的内存空间。
devi
2021/08/18
3300
Java复习【知识改变命运】第六章
1.区别相同名的类 2.当类很多时候更好的管理[API文档] 3.控制访问范围
用户11319080
2024/10/17
1010
Java复习【知识改变命运】第六章
Java中finalize()用法
http://bbs.csdn.net/topics/390375776 public class Book { boolean checkout = false; Book(boolean checkout){ this.checkout = checkout; } void checkIn(){ checkout = false; } protected void finalize(){ if(checkout){ System.out.println("Erro
bear_fish
2018/09/20
2.5K0
Java基础(九):Object 类的使用
使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++等非Java语言实现的,并且被编译成了DLL,由Java去调用
Java微观世界
2025/01/21
1870
Java基础(九):Object 类的使用
java — 垃圾回收
1. 垃圾回收的意义   在java中,当没有对象指向原先分配给某个对象的内存的时候,这片内存就变成了垃圾,JVM的一个系统级线程就会自动释放这个内存块,垃圾回收意味着程序不再需要的对象是“无用的信息”,这些信息会被丢弃。当一个对象不再被引用的时候,内存回收它所占用的空间,以便将空间用来存放后续的新对象。   除了①释放没用的对象,垃圾回收还可以②清除内存记忆碎片,由于创建对象和垃圾回收期释放丢弃对象所占的内存空间,内存会出现碎片,碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的对内存移动到堆
Mister24
2018/05/14
1.4K0
Java (强/弱/软/虚)引用
当内存不足,JVM 开始垃圾回收,对于强引用的对象,就算是出现了 OOM 也不会对该对象进行回收,死都不收。强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾回收器不会碰这种对象。在Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成内存泄漏的主要原因之一。对于一个普通对象,如果没有其他引用关系,只要超过引用的作用域或者显示地将强应用设置为null,一般就可以被垃圾收集。(当然具体回收时机是要看垃圾收集策略)。
Java架构师必看
2021/05/14
2570
Java (强/弱/软/虚)引用
Object类的常见方法总结
Object 类是 Java 中所有类的父类,每个类都直接或间接地继承自 Object 类。Object 类中定义了一些常用的方法,这些方法在 Java 编程中非常有用。以下是 Object 类中的一些常见方法及其用途:
代码小李
2025/01/30
1630
Java垃圾收集器
GC(垃圾收集器)算是Java语言的一大特色,不同于C/C++要我们手动释放内存,GC能够帮我们回收90%以上的“垃圾”。下面就来介绍一下垃圾收集器。
秃头哥编程
2019/06/04
5620
相关推荐
第三阶段-Java常见对象:【第八章 System类】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验