巩固 finalize() 方法

1、java gc要回收对象的时候,首先要调用这个类的finalize方法,但是并不是调用这个finalize方法就等同于垃圾回收,只是在gc之前 finalize 方法会被调用,所以基本可以说其被回收了。

2、但由于gc的自动回收机制,并不能保证 finalize 方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行(程序由始至终都未触发垃圾回收)。

3、提供这样的机制的原因在于:让我们有时想在撤消一个对象时完成一些操作(有点像生命周期钩子),比如一些Java以外的代码编写的Class(比如JNI-Java Native Interface,C语言malloc()分配的内存),垃圾回收器并不能对这些部分进行正确的回收,进而在 finalize 方法中另外干预(那这些Class要怎么用java代码释放呢?让Java代码去运行个shell脚本?);或者释放非Java 资源(如打开的文件资源、数据库连接等)。

4、如果在 finalize 中重新让对象不符合gc条件,这样对象就避开了一次gc,但下次对象再次符合条件的时候 finalize 不会被调用,因为 finalize 只能被调用一次(why)

5、最后:它什么时候会被调用

  • 所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候。
  • 程序退出时为每个对象调用一次finalize方法。
  • 显式的调用finalize方法。(那这样算被调用一次吗?)

再补充吧……

参考:https://blog.csdn.net/crazylai1996/article/details/84900818

原文地址:https://www.cnblogs.com/LinsenLi/p/10503924.html

时间: 2024-10-20 15:19:02

巩固 finalize() 方法的相关文章

Java GC与finalize方法

1. Object类有一个finalize()方法,所有类都有这个方法. 2.JVM在回收(GC)一个对象时会调用这个对象的finalize()方法. 但是 GC是靠不住的. 3. JVM只有在内存不够用的情况下才会调用GC,调用finalize()方法.如果内存够用,对象不会被GC,finalize()方法不会被调用. 4. 因此程序中应该主动回收资源,而不是在finalize()方法中回收资源.

[java]final关键字、finally关键字与finalize()方法

final关键字: final关键字通常指的是“无法改变的”,使用“无法改变”这样修饰可能出于两个原因:设计或者效率. final可以修饰变量.方法和类. 一.final变量 一个既是static又是final的域只占据一段不能改变的存储空间. 当对对象引用而不是基本类型运用final修饰时,其含义会有一点迷惑.对于基本类型,final使数值恒定不变.而用于对象引用,final使引用恒定不变.一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象.然而,对象自身却是可以修改的,java并未

JAVA中的finalize()方法

[转]JAVA中的finalize()方法 今天早上看Thinking in java的[第四章 初始化和清除].[  清除:终结和垃圾回收]的时候, 看到了这个东西. 用于清理滴... 当然,这个方法来自java.lang.Object finalize()方法的重写 权限(Access)需要是protected或者是public ,不能是private finalize()方法不需要显示地调用, 在垃圾回收(GC)时会被自动先行调用的. 据我测试,需要显示地调用垃圾回收方法(System.g

Java中的finalize方法理解

首先:system.gc()并不是你调用就马上执行的, 而是根据虚拟机的各种算法来来计算出执行垃圾回收的时间,另外,程序自动结束时不会执行垃圾回收的. 其次:对象被回收时,要经过两次标记,第一次标记,如果finalize被重写,或者finalize被调用过,那么垃圾回收并不会去执行finalize,第二次标记,如果对象不能在finalize中成功拯救自己,那真的就要被回收了. 咱们用的虚拟机一般都是sun的hotspot,以下描述都是针对hotspot虚拟机,当然其他虚拟机也差不多, ,,他是根

什么导致Finalize方法被调用

Finalize方法在垃圾回收结束时被调用,下面有5种事件会导致开始垃圾回收 1.第0代已满    第0代已满,垃圾回收会自动开始.该事件是目前导致Finalize方法被调用的最常见的一种方式,因为虽然应用程序的运行并分配新对象,这个事件会自然而然的发生. 2.代码显示调用System.GC的静态方法Collect   代码可以显示的请求CLR执行垃圾回收.虽然Microsoft强烈建议不要这样做,但某些时候还是必要的. 3.Windows报告内存不足   CLR内部使用Win32 Create

Java GC机制和对象Finalize方法的一点总结

GC是什么? 为什么要有GC? GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的. 有向图垃圾回收机制 .NET的垃圾回收采用引用计数,java的垃圾回收机制采取的是有向图的方式来实现,具体的说,java程序中的每个线程对象就可以看作是一个有向图的起点,有向边从栈中的引用者指向堆中的引用对象.在这个有向图中,如果

java finalize方法

程 序员都了解初始化的重要性,但常常会忘记同样重要的清除工作.毕竟,谁需要清除一个int 呢?但在使用程序库时,把一个对象用完后就“弃之不顾”的做法并非总是安全的.当然,Java有垃圾回收器来回收无用对象占据的内存资源.但也有特殊情 况:假定你的对象(并非使用 new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由 new分配的内存,所以它不知道该如何释放该对象的这块 “特殊”内存. 为了应对这种情况,Java允许你在类中定义一个名为finalize( )的方法.它的工作原理“应

finalize()方法对垃圾回收的影响

概述 Java中提供了一个类似C++析构函数的机制: finalize()方法,该函数允许子类重载,用于在对象被回收是释放资源. 但是一般情况下,尽量不要使用finalize函数进行资源的释放,原因主要有一下几点: finalize函数调用时,有可能导致对象复活. finalize函数执行的时间没有保障,他完全由GC线程决定,正常情况下,若不发生gc,则finalize一直都没有机会被执行. 一个坏的finalize函数会严重影响gc的性能. 实验 下面通过一个实验来看看: package co

finalize方法的使用

finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法.这个方法在gc启动,该对象被回收的时候被调用.其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的. 特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链

java ----------finalize方法总结、GC执行finalize的过程

java finalize方法总结.GC执行finalize的过程 分类: Java2013-10-06 16:42 73人阅读 评论(0) 收藏 举报 finalizejavajvm 目录(?)[+] 注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize()与C