java finalize 作用_java中的finalize方法有什么作用「建议收藏」

java finalize 作用_java中的finalize方法有什么作用「建议收藏」java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。其在Object中定义如下:protectedvoidfinalize()throwsThrowable{}…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。

69be7c17fd4c017d9378e6d1efdd61c9.png

finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。其在Object中定义如下:protected void finalize() throws Throwable { }

1 finalize()调用的时机

与C++的析构函数(对象在清除之前析构函数会被调用)不同,在Java中,由于GC的自动回收机制,因而并不能保证finalize方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行(程序由始至终都未触发垃圾回收)。public class Finalizer {

@Override

protected void finalize() throws Throwable {

System.out.println(“Finalizer–>finalize()”);

}

public static void main(String[] args) {

Finalizer f = new Finalizer();

f = null;

}

}

//无输出public class Finalizer {

@Override

protected void finalize() throws Throwable {

System.out.println(“Finalizer–>finalize()”);

}

public static void main(String[] args) {

Finalizer f = new Finalizer();

f = null;

System.gc();//手动请求gc

}

}

//输出 Finalizer–>finalize()

2 什么时候应该使用它

finalize()方法中一般用于释放非资源(如打开的文件资源、数据库连接等),或是调用非Java方法(native方法)时分配的内存(比如C语言的malloc()系列函数)。

3 为什么应该避免使用它

首先,由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客户端手动调用。

另外,重写finalize()方法意味着延长了回收对象时需要进行更多的操作,从而延长了对象回收的时间。

4 让对象再活一次

利用finalize()方法最多只会被调用一次的特性,我们可以实现延长对象的生命周期。class User{

public static User user = null;

@Override

protected void finalize() throws Throwable {

System.out.println(“User–>finalize()”);

user = this;

}

}

public class FinalizerTest {

public static void main(String[] args) throws InterruptedException {

User user = new User();

user = null;

System.gc();

Thread.sleep(1000);

user = User.user;

System.out.println(user != null);//true

user = null;

System.gc();

Thread.sleep(1000);

System.out.println(user != null);//false

}

}

推荐教程: 《java教程》

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

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

(0)
上一篇 2026年1月23日 上午9:22
下一篇 2026年1月23日 上午10:01


相关推荐

  • softmax为什么使用指数函数?(最大熵模型的理解)

    softmax为什么使用指数函数?(最大熵模型的理解)

    2021年11月19日
    44
  • 功能测试用例编写_接口测试用例设计思路

    功能测试用例编写_接口测试用例设计思路编写测试用例HttpRunnerv3.x支持三种测试用例格式pytest,YAML和JSON。官方强烈建议以pytest格式而不是以前的YAML/JSON格式编写和维护测试用例格式关系如下图所示

    2022年7月30日
    10
  • vs 安装包_vs离线安装包

    vs 安装包_vs离线安装包VS安装包注册com组件VS安装包注册com组件1.把你的com组件加入到打包程序。 2.在打包程序中找到该com组件,点击属性。在属性中有Register项,把值选择为vsdrfCOM即可。

    2022年10月13日
    4
  • mysql清空表数据后如何让自增ID仍从1开始

    mysql清空表数据后如何让自增ID仍从1开始有2种方法:1、清空表时使用truncate命令,而不用delete命令truncatetest;使用truncate命令的好处:1)、速度快2)、可以对自增ID进行重排,使自增ID仍从1开始计算2、清空表数据后,使用alter修改表altertabletable_nameauto_increment=1;…

    2022年5月16日
    52
  • 11 如何通过 “副本传输” 传输从DEV到QAS的请求号

    11 如何通过 “副本传输” 传输从DEV到QAS的请求号业务背景:在实际项目中,当顾问在DEV配置系统中做好配置,或者开发顾问在DEV开发系统中做好了开发,生成了请求号后,需要将对应的配置传输到QAS系统(集成测试系统),要想将请求号对应的配置或开发内容从DEV系统传输到QAS系统。常规操作就是需要将请求号进行释放后,在进行传输,但是在实际情况下,很多时候顾问的配置或开发内容并未全部完成或还需要进行局部修改的情况下,副本传输就可以解决既可以不释放请求号,又可以达到跨服务器传输请求号内容的目的了。PS:请求号一旦释放后,就不能再使用同一个请求号进行配置和

    2022年6月28日
    37
  • npm使用淘宝镜像(npm切换淘宝镜像)

    1.通过cnpm使用淘宝镜像:npminstall-gcnpm–registry=https://registry.npm.taobao.org2.将npm设置为淘宝镜像:npmconfigsetregistryhttps://registry.npm.taobao.org3.查看cnpm镜像设置:cnpmconfiggetregistry

    2022年4月10日
    362

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号