当前位置: 技术问答>java相关
请问各位到底是在什么时候调用对象的finalize方法的呢?
来源: 互联网 发布时间:2017-04-12
本文导语: 各位网友,大家好: 我想请教各位一个有关finalize方法的问题: finalize方法到底是在什么时候被调用的呢?我做了以下一个很简单的程序: class Test { protected void finalize() throws Throwable { ...
各位网友,大家好:
我想请教各位一个有关finalize方法的问题:
finalize方法到底是在什么时候被调用的呢?我做了以下一个很简单的程序:
class Test
{
protected void finalize() throws Throwable
{
super.finalize();
System.out.println("We're in Test finalize block!");
}
}
public class TestFinalize
{
public static void main(String[] args)
{
/*
Test t=new Test();
t=null;
*/
/*
Runtime rt=Runtime.getRuntime();
rt.gc();
*/
}
protected void finalize() throws Throwable
{
super.finalize();
System.out.println("We're in TestFinalize finalize block!");
}
}
我好象看到一本书上说,当对象将要被收集为无用信息的时候finalize方法被调用。可是我将对象引用设置为null时,应该对象会被垃圾收集程序收集了的呀!为什么还没有调用Test类中的finalize方法在屏幕上显示出语句。而我在main程序中显示设置调用垃圾收集程序,好象还是不能调用finalize方法!!!Test类中的和TestFinalize中的都不行。请问各位这是为什么啊??这finalize方法到底是在什么时候被调用的呢?什么时候会调用Test类中的finalize方法,什么时候会调用TestFinalize类中的呢?谢谢!!!解释的详细的,马上给分哈!
我想请教各位一个有关finalize方法的问题:
finalize方法到底是在什么时候被调用的呢?我做了以下一个很简单的程序:
class Test
{
protected void finalize() throws Throwable
{
super.finalize();
System.out.println("We're in Test finalize block!");
}
}
public class TestFinalize
{
public static void main(String[] args)
{
/*
Test t=new Test();
t=null;
*/
/*
Runtime rt=Runtime.getRuntime();
rt.gc();
*/
}
protected void finalize() throws Throwable
{
super.finalize();
System.out.println("We're in TestFinalize finalize block!");
}
}
我好象看到一本书上说,当对象将要被收集为无用信息的时候finalize方法被调用。可是我将对象引用设置为null时,应该对象会被垃圾收集程序收集了的呀!为什么还没有调用Test类中的finalize方法在屏幕上显示出语句。而我在main程序中显示设置调用垃圾收集程序,好象还是不能调用finalize方法!!!Test类中的和TestFinalize中的都不行。请问各位这是为什么啊??这finalize方法到底是在什么时候被调用的呢?什么时候会调用Test类中的finalize方法,什么时候会调用TestFinalize类中的呢?谢谢!!!解释的详细的,马上给分哈!
|
类似C++的OnDestroy()一样的,但是Java是在回收时调用。 因此只有垃圾收集时收集他时才会执行一些相关的操作——也就是你finalize()做的。
没有收集垃圾时不会执行的.
没有收集垃圾时不会执行的.
|
本人的发表点拙见:
finalize()确实是会在对象被收集为无用时被执行,但据我所知,在程序开始执行后,垃圾收集器并不是马上和程序同时启动,似乎要稍微有些延迟.比如,如果在程序中用循环的方式不停的产生空对象,垃圾回收器并不是在对象刚生成时就将其回收,不同的机器会有所不同,在我的机器上大概要到3000多个对象生成后才会开始回收.可能是你的程序太短,还没开始回收程序就结束了.
我是在这本书中看到的以上内容,具体内容记不清了.这本书可以在网上下载.网址如下:
www.pcbookcn.com
这本书里讲得很详细,还有原代码
finalize()确实是会在对象被收集为无用时被执行,但据我所知,在程序开始执行后,垃圾收集器并不是马上和程序同时启动,似乎要稍微有些延迟.比如,如果在程序中用循环的方式不停的产生空对象,垃圾回收器并不是在对象刚生成时就将其回收,不同的机器会有所不同,在我的机器上大概要到3000多个对象生成后才会开始回收.可能是你的程序太短,还没开始回收程序就结束了.
我是在这本书中看到的以上内容,具体内容记不清了.这本书可以在网上下载.网址如下:
www.pcbookcn.com
这本书里讲得很详细,还有原代码