- 作者:xiaoxiao
- 发表时间:2020-12-23 10:36
- 来源:未知
这是一个测试finilize()的程序:
class fin {String s = "Begin...";fin() {System.out.println(this.s);}fin(String s) {System.out.println(this.s + s);}public void finalize() {System.out.println("Closing...");}}
public class t4eleven {public static void main (String args[]) {
?fin a = new fin("Hello!");?new fin();?System.gc();
?new fin();?fin b = new fin("Hello! again.");?System.gc(); }}得结果:Begin...Hello!Begin...Begin...Begin...Hello! again.Closing...Closing...
但如果程序改为:class fin {String s = "Begin...";fin() {System.out.println(this.s); }fin(String s) {System.out.println(this.s + s); }public void finalize() {System.out.println("Closing..."); }}
public class t4eleven {public static void main (String args[]) {
fin a = new fin("Hello!");?new fin();?new fin();?System.gc();
fin b = new fin("Hello! again.");?System.gc(); }}结果会变成:Begin...Hello!Begin...Begin...Closing...Begin...Hello! again.Closing...=============
finalize是JVM垃圾回收时调用的,基本上垃圾回收的时间是无法保障的,只要JVM发现一个对象无任何引用了,就会去回收它。system.gc()只是说明代码建议JVM进行垃圾回收。
===============
/*Well,垃圾回收是这样的,它的原理是一种编译器技术,称之为“引用计数”技术,也就是说,每个创建的对象,在虚拟机的某个地方,保存着对象被引用的数目,如果没有引用指向某个对象,那么那个对象就是垃圾。
然而JVM不会马上就把那个垃圾回收掉,而要等到JVM发现内存不足时,它才会将所有的垃圾回收,这样其实更好,频繁的回收垃圾反而会使系统的效率降低。当然你也可以显示的调用垃圾回收来回收垃圾(System.gc())。
第一个程序的执行结果也是错的,应该是:Begin...Hello!Begin...Closing...Begin...Begin...Hello! again.Closing...
为了更好的理解垃圾回收,下面附上一个清晰的例子:主体还是沿用原代码,不过在fin类中加一个私有的整型数据id作为对象的标识,再定义一个静态的整型变量count,来统计fin生成的对象数。构造函数只取无参的,以下是完整的代码:*/