日期:2014-05-20  浏览次数:20672 次

小米笔试的一题。
这题搁了好久,都忘了问了。

以下程序打印什么结果?

Java code


public class No_4 {
      
       public static void main(String[] args) {
            MyClass m = new MyClass();
            m = null;
            System. gc();
            MyClass. o = null ;
            System. gc();
      }

}

class MyClass {
       public static MyClass o;
       protected void finalize() throws Throwable {
            System. out.println("finalize");
             o = this ;
      }
}



我在两台电脑上分别用eclipse ee和eclipse se跑,结果是:有时候会打印finalize,有时候什么都没有打印。而在main里边加入任意一条打印System.out.println("=====");,结果是一直都会打印finalize,但"====="和"finalize"的出现的顺序不定。
而在同学的电脑上跑,每次都打印finalize。。。

好苦恼啊,,谁知道为什么??顺便解释一下这道题哈。

抱歉:我只能发100分的帖子。

------解决方案--------------------
1楼说的很对,GC多长时间执行一次在JVM中是可以配置的。
如果你的JDK配置到环境变量中的话,在命令行执行命令 jconsole和 jvisualvm可以进入到JVM监视和管理控制台以及可视化VM中,在可视化VM中的 本地》visualVM》监视 下可以执行垃圾回收操作。你可以直观的看到JVM的运行状态。
------解决方案--------------------
探讨

引用:

System. gc();
LZ要知道这句代码只是通知垃圾回收器可以回收垃圾了,并不保证垃圾回收器马上就回收垃圾,所以不能保证finalize()是立即被执行的。
就好像我跟LZ你说一声,睡觉了,你听到了,但不保证你马上就睡觉,所以不保证你们家的灯立即被你熄掉,也就是你们家的灯的finalize()方法不保证马上被调用


嗯,谢谢回答,不过这个是知道的……