tij学习笔记Java finalize()的使用
Posted Hellxz博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tij学习笔记Java finalize()的使用相关的知识,希望对你有一定的参考价值。
《Java编程思想》中有提到,Java的垃圾回收器并不是那么靠谱,垃圾回收会占用很大的资源开销,垃圾回收器很懒,当变量和对象不再被引用、脱离作用域的时候,垃圾回收器会不定时的进行垃圾回收,也就是说,当内存资源紧张的时候,垃圾回收器才会以最快速度主动去回收资源释放内存,其他时候可能会回收也可能不会。
如果当垃圾回收器工作的时候,会自动调用finalize(),查看Object类的源码会发现这个方法是个空方法(先不管底层),是不是说这个方法我们可以去重写呢?
package com.github.hellxz.thinkinjava; public class TestFinalize { public static void main(String[] args) { /* * 创建FinalizeMethod类并调用 */ TestFinalize f = new TestFinalize(); f.finalize(); System.out.println("mian方法结束"); } /* * 重写了Object类的方法 */ protected void finalize(){ System.out.println("finalize方法执行了"); } }
//输出:
//finalize方法执行了
//mian方法结束
看了上述代码,我们证实了Object类的这个方法的确是可以被重写的,在书中说finalize是在垃圾回收器删除对象之前调用的方法,那么修改上述代码进行测试
package com.github.hellxz.thinkinjava; public class TestFinalize { public static void main(String[] args) { /* * 创建FinalizeMethod类并调用 */ TestFinalize f1 = new TestFinalize(); TestFinalize f2 = new TestFinalize(); TestFinalize f3 = new TestFinalize(); TestFinalize f4 = new TestFinalize(); System.out.println("mian方法结束"); } /* * 重写了Object类的方法 */ protected void finalize(){ System.out.println("finalize方法执行了"); } } //输出: //mian方法结束
虽然我们创建了这么多对象,而且都没有使用,但是重写的finalize方法并没有执行,这说明垃圾回收器并没有回收。Java中有System.gc()来强制垃圾回收器终结动作;为了使代码更有说服力,修改一下代码结构,使更直观
package com.github.hellxz.thinkinjava; public class TestFinalize { public static void main(String[] args) { Apple a1 = new Apple(1); Apple a2 = new Apple(2); Apple a3 = new Apple(3); Apple a4 = new Apple(4); a1 = null; //置空a1 a2 = null; //置空a2 System.gc(); System.out.println("mian方法结束"); } } class Apple{ private int i; public Apple(int i){ this.i = i; System.out.println("apple "+ i +" is created!"); } protected void finalize() throws Throwable { super.finalize(); //调用Object类方法 System.out.println("apple "+ i +" is disposed!"); } } //output: //apple 1 is created! //apple 2 is created! //apple 3 is created! //apple 4 is created! //mian方法结束 //apple 1 is disposed! //apple 2 is disposed!
结论:
1、不要过分依赖finalize方法来执行资源清除工作,垃圾回收器会自动回收资源的
2、finalize不同于c++的析构函数,无需主动释放内存,想调用可以使用System.gc();
3、finalize用于清除非Java语言占用的内存,以及检查错误
4、垃圾回收器不会一有垃圾就回收内存,除非内存吃紧
以上是关于tij学习笔记Java finalize()的使用的主要内容,如果未能解决你的问题,请参考以下文章
Java:Effective java学习笔记之 避免使用终结方法