JVM退出的时候,Object.finalize会被调用吗?

deviceisbusy 2010-03-04 03:38:45
问一个小问题:
JVM退出的时候,Object.finalize()这个方法会被调用吗?

谢谢!

import java.io.*;

public class TestTempFile {
public static void main(String[] args) throws Exception {
TestTempFile ttf = new TestTempFile();;
}

protected void finalize() throws Throwable {
System.out.println("it is finalized!");
}
}
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
deviceisbusy 2010-03-04
  • 打赏
  • 举报
回复
明白,谢谢大家了。
结贴了。
wenzheng38 2010-03-04
  • 打赏
  • 举报
回复
引用 4 楼 inkfish 的回复:
finalize只有垃圾回收的时候才会去调用。操作系统结束一个进程,会把那个进程申请的内存都清了,所以用不到gc

对,只有当一个程序结束时才会调用到finalize方法
而当JVM退出时,操作系统已经清理了JVM进程的内存空间
墨水鱼 2010-03-04
  • 打赏
  • 举报
回复
finalize只有垃圾回收的时候才会去调用。操作系统结束一个进程,会把那个进程申请的内存都清了,所以用不到gc
deviceisbusy 2010-03-04
  • 打赏
  • 举报
回复
也就是说,JVM退出的时候,不一定会进行垃圾回收。而finalize这个方法只是在垃圾回收的时候才会被调用,所以JVM退出的时候,不一定会调用finalize。这样说对吗?有没有相应的文档?
heartraid86 2010-03-04
  • 打赏
  • 举报
回复
Finalize方法,可以告诉垃圾回收器应该执行的操作,该方法从Object类继承而来。在从堆中永久删除对象之前,垃圾回收器调用该对象的Finalize方法。

但要注意,无法确切地保证垃圾回收器何时调用该方法,也无法保证调用不同对象的方法的顺序。

面的代码不可能打印出it is finalized!因为虚拟机推出之前ttf刚被创建,垃圾回收机制还不能及时判断出ttf对象已经不会再被任何线程使用了,这个时候程序已经执行完毕,虚拟机退出。自然finalize()方法也就不可能被调用而来。

如果实在是想打印,可以在虚拟机退出之前手动强制回收废用的对象:


import java.io.*;

public class TestTempFile {
public static void main(String[] args) throws Exception {
TestTempFile ttf = new TestTempFile();
//表示ttf已经不可能有任何线程会使用它了
ttf = null;
//运行垃圾回收器
System.gc();

}

protected void finalize() throws Throwable {
System.out.println("it is finalized!");
}
}
EM265 2010-03-04
  • 打赏
  • 举报
回复
恁直觉,应该会被调用

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧