当前位置: 技术问答>java相关
一道SCJP的垃圾收集器的问题.
来源: 互联网 发布时间:2015-06-24
本文导语: 运行以下代码: import java.io.*; public class Testgc{ public static void main(String args[]){ try{ TestFinalize tf = new TestFinalize(); tf.finalize(); tf = null; Runtime runtime = Runtime.getRuntime(); runtime.gc(); System.out.println("...
运行以下代码:
import java.io.*;
public class Testgc{
public static void main(String args[]){
try{
TestFinalize tf = new TestFinalize();
tf.finalize();
tf = null;
Runtime runtime = Runtime.getRuntime();
runtime.gc();
System.out.println("Just returned from garbage collection");
} //end try
catch(java.lang.Throwable throwable){
System.out.println("Catch exception in Testgc.java");
} //end catch
} //end main
} //end Testgc class
class TestFinalize{
protected void finalize() throws Throwable{
System.out.println("Hey, I'm in TestFinalize finalize()");;
}
} //end TestFinalize()
可能的输出是:
共有3个正确的答案:
1
Hey, I'm in TestFinalize finalize()
Just returned from garbage collection
2
Hey, I'm in TestFinalize finalize()
Hey, I'm in TestFinalize finalize()
Just returned from garbage collection
3
Hey, I'm in TestFinalize finalize()
Just returned from garbage collection
Hey, I'm in TestFinalize finalize()
为什么会出现这3种结果呢?
import java.io.*;
public class Testgc{
public static void main(String args[]){
try{
TestFinalize tf = new TestFinalize();
tf.finalize();
tf = null;
Runtime runtime = Runtime.getRuntime();
runtime.gc();
System.out.println("Just returned from garbage collection");
} //end try
catch(java.lang.Throwable throwable){
System.out.println("Catch exception in Testgc.java");
} //end catch
} //end main
} //end Testgc class
class TestFinalize{
protected void finalize() throws Throwable{
System.out.println("Hey, I'm in TestFinalize finalize()");;
}
} //end TestFinalize()
可能的输出是:
共有3个正确的答案:
1
Hey, I'm in TestFinalize finalize()
Just returned from garbage collection
2
Hey, I'm in TestFinalize finalize()
Hey, I'm in TestFinalize finalize()
Just returned from garbage collection
3
Hey, I'm in TestFinalize finalize()
Just returned from garbage collection
Hey, I'm in TestFinalize finalize()
为什么会出现这3种结果呢?
|
因为runtime.gc();调用后并不一定会马上执行。
答案1、
执行完tf = null;这以后,表明对象tf可以被回收,并在调用runtime.gc();以后被回收,因此finalize()只被执行了一次,所以。。。。
答案2、
执行完tf = null;这以后,表明对象tf可以被回收,且系统在这时回收,调用一次finalize(),接着又人工调用了runtime.gc();finalize()又被执行了一次,所以。。。。
答案3、
同上面差不多,只是很“巧”而已。
————————————————————————
如有不对之处,。。。。。还请大家指正。 :)
————————————————————————
答案1、
执行完tf = null;这以后,表明对象tf可以被回收,并在调用runtime.gc();以后被回收,因此finalize()只被执行了一次,所以。。。。
答案2、
执行完tf = null;这以后,表明对象tf可以被回收,且系统在这时回收,调用一次finalize(),接着又人工调用了runtime.gc();finalize()又被执行了一次,所以。。。。
答案3、
同上面差不多,只是很“巧”而已。
————————————————————————
如有不对之处,。。。。。还请大家指正。 :)
————————————————————————
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。