小米笔试的一题。

usenameR 2012-04-28 01:11:24
这题搁了好久,都忘了问了。

以下程序打印什么结果?



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分的帖子。
...全文
266 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sffx123 2012-04-28
  • 打赏
  • 举报
回复
实验也是每次都打印finalize。
传说中的大神 2012-04-28
  • 打赏
  • 举报
回复
楼上意思相近.
qybao 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 1 楼 的回复:

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


嗯,谢谢回答,不过这个是知道的……
[/Quote]
既然知道执行System.gc垃圾回收器不一定马上回收垃圾,那么不同的机器,也可以说是不同的环境,比如系统配置以及启动的服务和程序不同,都有可能影响垃圾回收器线程的CPU分配,所以结果不能保证都相同。就好像你写个程序输出1-10之间的随机数,每台机器或者每次执行结果都有可能相同或不同的道理一样。
桃园闲人 2012-04-28
  • 打赏
  • 举报
回复
1楼说的很对,GC多长时间执行一次在JVM中是可以配置的。
如果你的JDK配置到环境变量中的话,在命令行执行命令 jconsole和 jvisualvm可以进入到JVM监视和管理控制台以及可视化VM中,在可视化VM中的 本地》visualVM》监视 下可以执行垃圾回收操作。你可以直观的看到JVM的运行状态。
usenameR 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

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

嗯,谢谢回答,不过这个是知道的,发此贴目的是希望有人能帮我把该程序的运行过程分析分析,再者就是对两台电脑运行同样的程序,结果不一致有疑问,希望有人能帮我回答。
qybao 2012-04-28
  • 打赏
  • 举报
回复
System. gc();
LZ要知道这句代码只是通知垃圾回收器可以回收垃圾了,并不保证垃圾回收器马上就回收垃圾,所以不能保证finalize()是立即被执行的。
就好像我跟LZ你说一声,睡觉了,你听到了,但不保证你马上就睡觉,所以不保证你们家的灯立即被你熄掉,也就是你们家的灯的finalize()方法不保证马上被调用

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧