黑马程序员技术交流社区

标题: 关于垃圾回收器的问题 [打印本页]

作者: 戴振良    时间: 2012-3-25 15:35
标题: 关于垃圾回收器的问题
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句 “对象即将被释放!”
为什么"程序结尾"是第一句输出呢?
作者: 庞子华    时间: 2012-3-25 15:55
调用了gc(),并不会马上进行垃圾回收
作者: 戴振良    时间: 2012-3-25 15:58
我知道的是:不调用gc()系统也是会自动清除垃圾的,但是就是什么时候清除不固定
我加了gc()它还这样,那这个gc()干嘛用?
作者: 刘蕴学    时间: 2012-3-25 16:00
戴振良 发表于 2012-3-25 15:58
我知道的是:不调用gc()系统也是会自动清除垃圾的,但是就是什么时候清除不固定
我加了gc()它还这样,那这 ...

你就算调用了,他也不是马上就执行的,因为还得看你程序是不是有其他事情,得"空闲的时候才会执行"。。。。
作者: 丰亚彬    时间: 2012-3-25 17:57
首先为什么输出语句在输出第一行,因为你调用了gc()方法,你只是告诉回收器有东西要回收但是什么时候回收是jvm控制的不是你控制的,所以你执行多次可能结果会不同。
其次,你说为什么不输出3句“对象即将被释放!”,我个人认为是这样的,垃圾回收器在jvm是以线程执行的,当该线程执行,释放了2个Person对象的堆空间后,CPU去执行你的程序了,如果你的程序已经结束了,那么CPU再次调用时,肯定不会在控制台显示了,因为你的java程序都已经停止了....
这就跟我们学多线程时使用的那些范例差不多,每次运行的结果都不是一致的,是由CPU决定的。
哈哈,不一定对,希望高手可以指点一下

作者: 戴振良    时间: 2012-3-27 17:36
运行完: System.out.println("程序结尾"); 这一句程序不就结束了吗?怎么还会输出两句:对象即将被释放! ?{:soso__8961432591078930798_3:}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2