A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-3-25 15:35  /  1875 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Person {

        public void finalize() {
                System.out.println("对象即将被释放!");
        }

        public static void main(String args[]) {
                new Person();
                new Person();
                new Person();
                System.gc();
                System.out.println("程序结尾");
        }

}
输出如下:
                程序结尾
                对象即将被释放!
                对象即将被释放!

为什么不是输出3句 “对象即将被释放!”
为什么"程序结尾"是第一句输出呢?

5 个回复

倒序浏览
调用了gc(),并不会马上进行垃圾回收
回复 使用道具 举报
我知道的是:不调用gc()系统也是会自动清除垃圾的,但是就是什么时候清除不固定
我加了gc()它还这样,那这个gc()干嘛用?
回复 使用道具 举报
戴振良 发表于 2012-3-25 15:58
我知道的是:不调用gc()系统也是会自动清除垃圾的,但是就是什么时候清除不固定
我加了gc()它还这样,那这 ...

你就算调用了,他也不是马上就执行的,因为还得看你程序是不是有其他事情,得"空闲的时候才会执行"。。。。
回复 使用道具 举报
首先为什么输出语句在输出第一行,因为你调用了gc()方法,你只是告诉回收器有东西要回收但是什么时候回收是jvm控制的不是你控制的,所以你执行多次可能结果会不同。
其次,你说为什么不输出3句“对象即将被释放!”,我个人认为是这样的,垃圾回收器在jvm是以线程执行的,当该线程执行,释放了2个Person对象的堆空间后,CPU去执行你的程序了,如果你的程序已经结束了,那么CPU再次调用时,肯定不会在控制台显示了,因为你的java程序都已经停止了....
这就跟我们学多线程时使用的那些范例差不多,每次运行的结果都不是一致的,是由CPU决定的。
哈哈,不一定对,希望高手可以指点一下
回复 使用道具 举报
运行完: System.out.println("程序结尾"); 这一句程序不就结束了吗?怎么还会输出两句:对象即将被释放! ?{:soso__8961432591078930798_3:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马