finalize()、gc()、runFinalization()方法说明

finalize()

它是Object父类里的方法,子类可以复写这个方法。

它的工作原理是这样的:当垃圾回收器确定该对象(使用new创建的对象)不再被任何其它对象引用时,垃圾回收器将在进行对该对象的内存回收之前会先调用一次该对象的finalize()方法。

假设某个对象包含一块特殊内存(native内存,非new创建的内存)时,这块特殊内存并不会被垃圾回收器释放,因此可以在该对象的finalize()方法中释放特殊内存,这样可以确保该对象相关的所有内存都会被垃圾回收器回收。这是Object类中设计finalize()方法的初衷。

但是我们并不能把这个方法当做通用的内存清理方法,原因是因为垃圾回收并不一定会发生,我们可能会发现,等到程序濒临内存用完的时候,才会发现内存得到了释放。比如andoid里的Bitmap对象,我们希望当确定bitmap对象不再使用时,应该主动的去调用recycle()方法释放内存,而不是提供一个finalize方法让垃圾回收器去执行内存回收。我们可以想象的是如果bitmap是通过finalize()去释放内存,很有可能是当程序发生了OOM时,垃圾回收器才开始执行不再使用的bitmap对象的垃圾回收,而此时已经迟了。

事实上,finalize()更为有用的是在内存优化调试时使用;另外《Java编程思想》中提供了一个“终结条件”的用法。

当对某个对象不再感兴趣——也就是说它可以被清理了。此时这个对象应该处于某种状态使它占用的内存可以被安全地释放。比如一个对象打开了一个文件,当这个对象不再被引用时,我们应该确保文件已经被关闭。因此我们可以在finalize()中添加log来发现隐藏缺陷。finalize()就是终结条件,因为对象的finalize()方法被执行,就表明该对象已经是无用的了。

示例:

public class TerminationCondition{

	public static void main(String[] args){
		Book novel = new Book(true);
		novel.checkIn();
		new Book(true);
		for(int i = 0; i < 100; i++){
			System.gc();//添加循环是因为gc()只是建议系统执行垃圾回收,但并不一定会马上执行,添加100次的循环确保对象被垃圾回收		}
	}

}

class Book{
	boolean checkedOut = false;

	Book(boolean checkOUt){
		checkedOut = checkOUt;
	}

	void checkIn(){
		checkedOut = false;
	}

	protected void finalize() throws Throwable{
		if(checkedOut){
			System.out.println("Error: checked out");
		}
		super.finalize();
	}
}

 

System.gc()

建议虚拟机执行垃圾回收,具体什么时候执行由虚拟机决定。程序中调用这个方法可以增大垃圾回收发生的概率。但不建议频繁执行,因为垃圾回收是耗时操作,会增加系统负担。

runFinalization()

建议执行不再被使用,即将被垃圾回收器回收的对象的finalize()方法,同gc()方法一样,只是建议虚拟机执行。实际测试中finalize()方法还是由gc发生的时候执行,并不会因为调用了runFinalization()而在gc发生之前就会执行。

时间: 2024-10-26 09:21:12

finalize()、gc()、runFinalization()方法说明的相关文章

C#中Dispose,finalize,GC,析构函数区别(转)

释放类所使用的未托管资源的两种方式:         1.利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销.         2.IDisposable接口提供了一种机制,允许类的用户控制释放资源的时间,但需要确保执行Dispose(). 一般情况下,最好的方法是执行这两种机制,获得这两种机制的优点,克服其缺点.假定大多数程序员都能正确调用Dispose(),实现IDisposable接口,同时把析构函数作为一种安全的机

第十六节(Object类(toString() 、finalize、equals方法)

Object 类类 a) Object 类是所有 Java 类的根基类 b) 如果在类的声明中未使用 extends 关键字指明其基类,则默认基类为 Object 类 toString() 返回该对象的字符串表示. 通常 toString 方法会返回一个 “以文本方式表示” 此对象的 字符串,Object 类的 toString 方法返回一个字符串,该字符串由类名加标记 @和此对象哈 希码的无符号十六进制表示组成 /* 关于Object 中的 toString 方法: sun在Object类中设

Android防止GC的方法

\app\src\main\AndroidManifest.xml android:persistent="true" \app\src\main\kotlin\com\nononsenseapps\feeder\model\FeedParser.kt val cacheSize = 1000 * 1024 * 1024 // 1000 MiB 原文地址:https://www.cnblogs.com/cuthead/p/GC.html

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

Android内存优化1 了解java GC 垃圾回收机制2 GC执行finalize的过程

1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize()与C++中的析构函数不是对应的.C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性 不建议用finalize方法完成"非内存资源"的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象):② 作为确保某些非内存资源(如Socket.

System.gc()与Object.finalize()的区别

finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关. 1.构造函数 要点: 构建器(Constructor)属于一种较特殊的方法类型,因为它没有返回值.这与 void返回值存在着明显的区别.对于void返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西.构建器则不同,它不仅什么也不会自 动返回

java finalize方法

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

finalize方法的使用

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

Think in java 笔记之 finalize() 函数

1. java垃圾收集机制概述 Java用new关键字生成的对象放在堆空间中,引用句柄则放在栈空间中.一个对象可以有多个引用.由于垃圾收集器的存在,对象是没有作用域的,引用句柄才有作用域.所以,当该对象的最后一个引用的作用域结束,或者该对象的最后一个引用指向了另一个对象或null,也就是说当该对象已经没有被任何引用句柄所引用的时候,该对象就可以被java垃圾收集器所回收了.回收发生的时间是不确定的,不过可以调用gc()方法通知jvm回收垃圾. 2. finalize()方法 它是object类的