finalize与gc的区别
**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() + "运行了");
}
}
上一篇: 不够“聪明”——记微软PM笔试+面试
下一篇: 网络编程之socket
推荐阅读