欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

finalize与gc的区别

程序员文章站 2022-05-06 16:52:18
...

**Object.finalize()
当垃圾回收器确定,不存在对该对象的更多引用时,由该对象的垃圾回收器调用此方法,子类重写finalize()方法,以配置系统资源或执行其他清除。
Object 类的 finalize 方法执行非特殊性操作;它仅执行一些常规返回。Object 的子类可以重写此定义。在里面对我们想要的东西进行收尾。

System.gc()
运行垃圾回收器:
调用gc方法暗示着Java虚拟机做了 一些努力来回收未用对象,以便能够快速的重用这些对象所占用的内存,当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。

区别
1.清除的内容不同
gc()只能清除在堆上分配的内存(纯java语言所有的对象都是在堆上使用new分配出来的),而不能清除栈上分配的内存;
如果某些对象呗分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize()来解决,(例如:当使用JNI技术时,可能会在栈上分配内 存,例如 java调用c程序,而该c程序使用malloc分配内存时)
再例如:
,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法 调用它(free()).
2.使用地方不同
finalize()是由JVM自己调用的,只需在类中重写即可,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关。一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用的就是finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.
而gc()需要调用;

总结:finalize()是在对象被GC回收前会调用的方法,而System.gc()强制GC开始回收工作纠正,不是强制,是建议,具体 执行要看GC的,意思简单地说,调用了 System.gc() 之后,java 在内存回收过程中就会调用那些要被回收的对象的 finalize() 方法。
另外总结一下:
1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
2.程序退出时为每个对象调用一次finalize方法。
3.显式的调用finalize方法

附录

package day22;

public class Test7 {
	public static void main(String[] args) {
		Person p = new Person("zs");// 强引用
		System.out.println(p);
		p = null;// 销毁p
		System.gc();// 运行垃圾回收
//		System.out.println(p.toString());// 空指针
	}

}

class Person {
	private String name;

	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Person(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}

	// JVM来管理
	@Override
	protected void finalize() throws Throwable {// 收尾工作
		System.out.println(this.getName() + "运行了");
	}

}