Java GC与finalize方法

1. Object类有一个finalize()方法,所有类都有这个方法。

2.JVM在回收(GC)一个对象时会调用这个对象的finalize()方法。

但是 GC是靠不住的。

3. JVM只有在内存不够用的情况下才会调用GC,调用finalize()方法。如果内存够用,对象不会被GC,finalize()方法不会被调用。

4. 因此程序中应该主动回收资源,而不是在finalize()方法中回收资源。

时间: 2024-10-26 07:38:53

Java GC与finalize方法的相关文章

JAVA中的finalize()方法

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

JVM【第十三回】:【Java对象存活------finalize()方法】

在根搜索算法中不可达的对象,也并非是"非死不可"的,这个时候他们暂时处于"缓刑"阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是对象是否有必要执行finalize()方法.当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为"没有必要执行". 如果这个对象被判定为有必要

JAVA中GC时finalize()方法是不是一定会被执行?

在回答上面问题之前,我们一定要了解JVM在进行垃圾回收时的机制,首先: 一.可达性算法  要知道对象什么时候死亡,我们需要先知道JVM的GC是如何判断对象是可以回收的.JAVA是通过可达性算法来来判断对象是否存活的.这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots 没有任何引用链相连时,则证明此对象是不可用的. 在JAVA语言中,可以作为GC Roots的对象包括下面几种: * 虚拟机栈(

Java类的finalize()方法

Java的Object类提供了一个finalize()方法,签名如下: protected void finalize() throws Throwable { } 该方法在JVM进行垃圾回收时之行,所以任何类都可以Override该方法,来让自己的类的实例在被回收之前,执行一系列动作. 可以通过如下两种方式来让主动让JVM进行垃圾回收: System.gc(); Runtime.getRuntime().gc(): 但是JVM不保证立即执行gc操作. finalize()方法使用示例如下: p

Java中的finalize方法理解

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

finalize方法与Java GC

转自http://www.threaddeath.com/ 闲逛ITEye时看到了译帝的一篇翻译博客,其中提到了关于Java类重写finalize方法后带来的诡异的GC overhead limit问题.博客的结尾非常详细的说明了这个问题产生的原理,但是始终有一个地方没有得到清晰的答案:由于finalize方法是Object类的protected方法,即无论重写与否,所有的Java类都会带有finalize方法,但为什么只有重写之后才会出现GC问题,不重写与重写的真实差别到底在哪儿? 通过思考始

巩固 finalize() 方法

1.java gc要回收对象的时候,首先要调用这个类的finalize方法,但是并不是调用这个finalize方法就等同于垃圾回收,只是在gc之前 finalize 方法会被调用,所以基本可以说其被回收了. 2.但由于gc的自动回收机制,并不能保证 finalize 方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行(程序由始至终都未触发垃圾回收). 3.提供这样的机制的原因在于:让我们有时想在撤消一个对象时完成一些操作(有点像生命周期钩子),比如一些Java以外的代码

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

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

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