免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1828 | 回复: 8
打印 上一主题 下一主题

关于finalize方法的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-16 10:44 |只看该作者 |倒序浏览
JVM不会在一个对象上调用超过一次以上的finalized()方法。
为什么我的执行结果却不同?


package pk2;

public class DD extends Object {

        /**
         * @param args
         * @throws Throwable
         */
        public static void main(String[] args) throws Throwable {
                DD dd = new DD();
                dd.finalize();
                dd.finalize();

        }

        @Override
        protected void finalize() throws Throwable {
                System.out.println("finalize");
                super.finalize();
        }
       
}

输出结果是:
finalize
finalize

论坛徽章:
0
2 [报告]
发表于 2012-07-16 11:40 |只看该作者
请各位高手解释一下这个问题!

论坛徽章:
4
CU十二周年纪念徽章
日期:2013-10-24 15:41:34摩羯座
日期:2013-12-24 13:05:332015亚冠之西悉尼流浪者
日期:2015-10-09 16:03:47fulanqi
日期:2016-06-17 17:54:25
3 [报告]
发表于 2012-07-16 14:29 |只看该作者
首先你要明白,finalize()是被JVM自动调用的。一旦GC准备释放对象占用的存储空间,它会首先寻找并试图调用finalize(),也就是说,这是JVM在进行内存清理前的一个释放资源使用的机制,是一种系统行为。用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。finalize()的调用是不确定的,jvm不保证finalize()一定被调用,一般不推荐这个方法的使用。

论坛徽章:
4
CU十二周年纪念徽章
日期:2013-10-24 15:41:34摩羯座
日期:2013-12-24 13:05:332015亚冠之西悉尼流浪者
日期:2015-10-09 16:03:47fulanqi
日期:2016-06-17 17:54:25
4 [报告]
发表于 2012-07-16 14:34 |只看该作者
如果你要观察这种机制,可以这样测试下:

        public static void main(String[] args) {
                new DD();
                System.gc();
        }

论坛徽章:
0
5 [报告]
发表于 2012-07-18 09:46 |只看该作者
回复 4# hbsycw


    API上说finalize方法是GC调用的。当JVM确认任何线程都无法访问那个对象时才调用GC销毁那个对象。是不是应该理解为:虽然我在程序里调用了两次finalize()方法,但是GC在后台却把这两次调用忽略了。

论坛徽章:
0
6 [报告]
发表于 2012-07-18 12:35 |只看该作者
永远不要去试图调用finalize();和gc() 方法,这是JVM去决定是否回收的,你的手动调用JVM不保证会执行,如果需要深究,建议去读JVM源码,或者深入学习下JVM

论坛徽章:
4
CU十二周年纪念徽章
日期:2013-10-24 15:41:34摩羯座
日期:2013-12-24 13:05:332015亚冠之西悉尼流浪者
日期:2015-10-09 16:03:47fulanqi
日期:2016-06-17 17:54:25
7 [报告]
发表于 2012-07-18 12:41 |只看该作者
回复 5# hongshaohu

请参看懒羊羊的回复~


   

论坛徽章:
0
8 [报告]
发表于 2012-07-18 14:59 |只看该作者
OK, 谢谢了

论坛徽章:
0
9 [报告]
发表于 2012-07-23 17:53 |只看该作者
是你自己手动调用的缘故吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP