首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不确定为什么finalize运算符不运行

finalize运算符是Java语言中的一个特殊方法,用于在对象被垃圾回收之前执行一些清理操作。然而,由于Java虚拟机的垃圾回收机制的不确定性,无法保证finalize方法一定会被执行。

在Java中,当一个对象不再被引用时,垃圾回收器会在合适的时机自动回收该对象所占用的内存空间。在回收之前,垃圾回收器会调用该对象的finalize方法,以便在对象被销毁之前执行一些清理操作,例如关闭文件、释放资源等。

然而,finalize方法的执行并不是及时的,也不是可靠的。具体来说,有以下几个原因导致finalize方法可能不会被执行:

  1. 垃圾回收器的行为不确定:垃圾回收器的具体实现和行为是由Java虚拟机决定的,不同的虚拟机可能有不同的垃圾回收策略。因此,无法保证finalize方法在对象被回收时一定会被调用。
  2. 对象可能被重新引用:在finalize方法执行期间,对象可能被其他代码重新引用,这样垃圾回收器就不会回收该对象,从而导致finalize方法不会被再次调用。
  3. finalize方法的执行时间不确定:由于垃圾回收器的工作是在后台进行的,并且与应用程序的其他代码并发执行,因此finalize方法的执行时间是不确定的。这意味着finalize方法可能会延迟执行,甚至永远不会执行。

由于finalize方法的不确定性和不可靠性,它已经被Java官方不推荐使用。取而代之的是,应该使用try-finally或try-with-resources语句块来确保资源的正确释放和清理。

总结起来,finalize运算符不运行的原因是由于Java虚拟机的垃圾回收机制的不确定性,无法保证finalize方法一定会被执行。因此,在开发中应该避免依赖finalize方法来进行资源的释放和清理,而是使用其他可靠的方式来处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。...finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。...)不同,在Java中,由于GC的自动回收机制,因而并不能保证finalize方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行(程序由始至终都未触发垃圾回收)。...3 为什么应该避免使用它 首先,由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

71120

.Net中Finalize()和Dispose()有什么区别?

释放类所使用的未托管资源的两种方式: 1.利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销。...这时候会用到这个,再如:文件的打开,如果释放会影响其它操作,如删除操作。调用Dispose后这个对象就不能再用了,就等着被GC回收。)   3. 提供Close方法。...,在显示调用或者离开using程序块 确定,在显示调用时 Finalize()Dispose()Object 类的方法 属于Idisposable 接口执行速度慢 速度快执行时机是不确定性,它意味着当垃圾收集器调用...Finalize() Dispose() Object 类的方法 属于Idisposable 接口 执行速度慢 速度快 执行时机是不确定性,它意味着当垃圾收集器调用finalize()方法来回收内存时。...Finalize() Dispose() Object 类的方法 属于Idisposable 接口 执行速度慢 速度快 执行时机是不确定性,它意味着当垃圾收集器调用finalize()方法来回收内存时。

1.4K20

浅析finalize方法「建议收藏」

这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束,这样做的原因是,如果一个对象在finalize()方法中执行缓慢,或者发生了死循环(更极端的情况),将很可能会导致F-Queue队列中其他对象永久处于等待...Finalize方法合适被调用,是否被调用具有不确定性,不要把finalize方法当做一定会执行的方法, 当JVM执行课恢复对象的finalize方法时,可能是改对象或系统中其他对象重新变成可达状态...---- 实例说明: 运行结果可以看出,SAVE_HOOK对象的finalize()方法确实被GC收集器触发过,并且在被收集前成功逃脱了。...它的运行代价高昂,不确定性大,无法保证各个对象的调用顺序。有些教材中描述它适合做“关闭外部资源”之类的工作,这完全是对这个方法用途的一种自我安慰。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

32910

Java高级编程:Finalize 引发的内存溢出

Object 类的 finalize 方法执行任何特殊操作;它只是正常返回。 Object 的子类可以覆盖这个定义。...finalize() 的使用与规避 不同于 C++ 的析构函数(对象在被释放之前析构函数会被调用),在Java中,由于 GC 的自动回收机制,因而并不能保证 finalize() 方法会被及时地执行(垃圾对象的回收时机具有不确定性...由于 finalize() 方法的调用时机具有不确定性,从一个对象变得不可到达开始,到 finalize() 方法被执行,所花费的时间这段时间是任意长的。...为什么会这样?既然已经没有人引用这些对象了,为什么它们没有在新生代中被回收掉?代码这么写有什么问题吗?...再看一眼GC的日志,也只能看到一些廉价的新生代 GC 在不停的运行。这样问题就显而易见是发生在了 finalize() 方法上了。修改后的这段程序中,的确没有方法和类引用到了新生代的这些刚创建的对象。

2.4K30

Object对象你真理解了吗?

其实就可以归纳成几个: registerNatives()【底层实现、研究】 hashCode() equals(Object obj) clone() toString() notify() notifyAll...这也就是为什么,我们可以直接使用String.equals()来判断两个字符串是否相等! 下面我们就来看看它的实现吧: ? ?...notify()唤醒的是在等待队列的某个线程(不确定会唤醒哪个),notifyAll()唤醒的是等待队列所有线程 导致wait()的线程被唤醒可以有4种情况 该线程被中断 wait()时间到了 被notify...5.1为什么wait和notify在Object方法上?...()方法 finalize()方法将在垃圾回收器清除对象之前调用,但该方法不知道何时调用,具有不定性 一般我们都不会重写它~ 一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着

56690

2021Java就业笔试题总结

为什么要有GC? 6、String s = new String(“xyz”);创建了几个String Object? 7、short s1 = 1; s1 = s1 + 1;有什么错?...子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 2、&和&&的区别?  &是位运算符。...为什么要有GC? 基础。GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。...这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非 (a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。...也就是说,它表示如果程序运行正常,从不会发生的情况。  11、List, Set, Map是否继承自Collection接口?

40020

JVM(三)对象的生死判定和算法详解

为什么要学习GC? 1、排查内存溢出和内存泄露的问题。 2、系统调优,处理更高的并发瓶颈。 GC的作用 1、找到内存空间的垃圾。 2、回收垃圾。...referenceDemo2; referenceDemo2.instance = referenceDemo; System.out.println(String.format("运行...: 开始:117 M 运行中:96 M 结束:119 M 从结果可以看出,虚拟机并没有因为相互引用就不回收它们,也侧面说明了虚拟机并不是使用引用计数器实现的。...执行finalize()方法的两个条件: 1、重写了finalize()方法。 2、finalize()方法之前没被调用过,因为对象的finalize()方法只能被执行一次。...建议使用finalize()方法来拯救对象,原因如下: 1、对象的finalize()只能执行一次。 2、它的运行代价高昂。 3、不确定性大。 4、无法保证各个对象的调用顺序。

50230

Java中finalize方法

前沿:在面试过程中我们可能会被问到final、finally、finalize的区别?本篇文章将介绍finalize的简单用法。 Finalize()是Object类的方法。...在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。 finalize()方法将重写以处理系统资源,执行清理活动并最大程度地减少内存泄漏。...但时间不确定。...程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有 一些效果,但是系统是否进行垃圾回收依然不确定。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

1K40

看ThreadPoolExecutor源码前的骚操作

想必看到这里,大学学的原码,补码,反码,十进制与二进制,运算符都忘光了吧。我们来回顾一下运算符的知识点。 运算符 Java支持的位运算符有7个: &:按位与。当两位同时为1时才返回1。...单目运算符,将操作数的每个位(包括符号位)全部取反。 ^:按位异或。当两位相同时返回0,不同时返回1。 <<:左移运算符。 >>:右移运算符。 >>>:无符号位右移运算符。...计算机中为什么使用补码来存储数据 1.看到上面的例子就懂了。+0的原码和反码和-0的原码和反码都不一样,而它们的补码都是一样的。就是解决了这种不一致的问题。 2.符号位和其他有效值一起进行处理。...SHUTDOWN:接收新的任务,但是会处理队列中的任务和正在运行中的任务。 STOP:接收新的任务,也处理队列中的任务,中断正在执行中的任务。...我们还要明白线程池运行状态的转换 running 到shutdown的过程:显式调用shutdown()方法,或者在线程池中调用finalize方法。

47910

.NET面试题解析(06)-GC与内存管理

为什么有些编程建议里推荐使用析构函数呢? 9. Finalize() 和 Dispose() 之间的区别? 10. Dispose和Finalize方法在何时被调用?...性能优化建议 尽量不要手动执行垃圾回收的方法:GC.Collect() 垃圾回收的运行成本较高(涉及到了对象块的移动、遍历找到不再被使用的对象、很多状态变量的设置以及Finalize方法的调用等等),对性能影响也较大...为什么有些编程建议里推荐使用析构函数呢? C#里的析构函数其实就是终结器Finalize,因为长得像C++里的析构函数而已。...有些编程建议里推荐使用析构函数要原因在于:第一是Finalize本身性能并不好;其次很多人搞不清楚Finalize的原理,可能会滥用,导致内存泄露,因此就干脆别用了 9....finalize不能保证立即释放非托管资源,Finalizer被执行的时间是在对象不再被引用后的某个不确定的时间;而dispose一调用便释放非托管资源。

55110

Java中finalize()用法

,而不是每次都输出,请问一下这是为什么呢? 难道System.gc()不是每次执行的时候都会调用finalize()方法吗? ...在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。...()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因 垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class...()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因 垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class...()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因

2.4K30

.NET面试题解析(06)-GC与内存管理

为什么有些编程建议里推荐使用析构函数呢? 9. Finalize() 和 Dispose() 之间的区别? 10. Dispose和Finalize方法在何时被调用?...有些编程意见或程序猿建议大家使用Finalize,尽量使用Dispose代替,我觉得可能主要原因在于:第一是Finalize本身性能并不好;其次很多人搞不清楚Finalize的原理,可能会滥用,导致内存泄露...为什么有些编程建议里推荐使用析构函数呢? C#里的析构函数其实就是终结器Finalize,因为长得像C++里的析构函数而已。...有些编程建议里推荐使用析构函数要原因在于:第一是Finalize本身性能并不好;其次很多人搞不清楚Finalize的原理,可能会滥用,导致内存泄露,因此就干脆别用了 9....finalize不能保证立即释放非托管资源,Finalizer被执行的时间是在对象不再被引用后的某个不确定的时间;而dispose一调用便释放非托管资源。

60520

看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了

是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经推荐使用了。...例如 static final int num = 1024 一个运行时被初始化的值,而且你希望改变它 final 的设计会和 abstract 的设计产生冲突,因为 abstract 关键字主要修饰抽象类...finalize 真的没用吗 我们上面简单介绍了一下 finalize 方法,并说明了它是一种不好的实践。那么 finalize 调用的时机是什么?为什么finalize 没用呢?...我们知道,Java 与 C++ 一个显著的区别在于 Java 能够自动管理内存,在 Java 中,由于 GC 的自动回收机制,因而并不能保证 finalize 方法会被及时地执行(垃圾对象的回收时机具有不确定性...也就是说,finalize 的执行时期不确定,我们并不能依赖于 finalize 方法帮我们进行垃圾回收,可能出现的情况是在我们耗尽资源之前,gc 却仍未触发,所以推荐使用资源用完即显示释放的方式,比如

31030

Java 后台开发面试题分享六

堆则是由 C/C++ 提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。 (6)存放内容不同。...类型强制转换异常 IllegalArgumentException - 传递非法参数异常 ArithmeticException - 算术运算异常 ArrayStoreException - 向数组中存放与声明类型兼容对象异常...finalize() 的调用具有不确定行,只保证方法会调用,但不保证方法里的任务会被执行完。...是 Java 开发的核心,包括了 Java 运行环境 jre,很多的 Java 工具,以及一些 Java 基础类库。 JRE - Java Runtime Environment,Java 运行环境。...是运行基于 Java 语言编写的程序所不可缺少的运行环境。 JVM - Java Virtual Machine,Java 虚拟机。是 Java 实现跨平台的最核心部分。

46730

垃圾收集策略静态内存分配和回收动态内存分配和回收1 Java堆内存的回收2 回收无效对象的过程3 方法区的内存回收4 垃圾收集算法5 Java中引用的种类

程序计数器、虚拟机栈、本地方法栈都是线程私有的,会随着线程而生,随线程而灭 栈中的栈帧随着方法的进入和退出有条紊的执行着出栈和入栈操作....包括原生数据类型及对象的引用 这些静态内存空间在栈上分配的,方法运行结束,对应的栈帧撤销,内存空间被回收....动态内存分配和回收 在程序执行时才知道要分配的存储空间大小,对象何时被回收也是不确定的,只有等到该对象不再使用才会被回收....注意:强烈建议使用finalize()进行任何操作!...因为finalize()不确定性大,开销大,无法保证各个对象的调用顺序.

1K101

object.finalize_object的equals方法

finalize的作用 (1)finalize()与C++中的析构函数不是对应的。...C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性 (2)建议用finalize方法完成“非内存资源”的清理工作,但建议用于:①...方法至多由GC执行一次(用户当然可以手动调用对象的finalize方法,但并不影响GC对finalize的行为) finalize的执行过程(生命周期) (1) 首先,大致描述一下finalize流程:...,但可通过某个finalizable对象可达 unreachable:对象不可通过上面两种途径可达 (1)新建对象首先处于[reachable, unfinalized]状态(A) (2)随着程序的运行...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

64610

优秀Java程序员必须了解的GC工作原理

这也给Java程序员的开发带来行多不确定性。本文研究了几个与GC工作相关的问题,努力减少这种不确定性给Java程序带来的负面影响。...根据Java语言规范,JVM保证调用finalize函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。另外,规范还保证finalize函数最多运行一次。...原因有三,其一,GC为了能够支持finalize函数,要对覆盖这个函数的对象作很多附加的工作。其二,在finalize运行完成之后,该对象可能变成可达的,GC还要再检查一次该对象是否是可达的。...因此,使用 finalize会降低GC的运行性能。其三,由于GC调用finalize的时间是不确定的,因此通过这种方式释放资源也是不确定的。...下面给出一个例子说明,finalize函数被调用以后,仍然可能是可达的,同时也可说明一个对象的finalize只可能运行一次。

82640
领券