java中finalize()方法

  • Post author:
  • Post category:java




finalize

垃圾回收机器(Garbage Collection),也叫GC,垃圾回收器主要有一下特点:

  • 当对象不再被程序所使用的时候,垃圾回收器将会将其回收
  • 垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他可以尽快回收资源(System.gc()和Runtime.getRuntime().gc())
  • 垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize()方法
  • GC主要针对堆内存
  • 单例模式的缺点


finalize()

是Object里面的一个方法,当一个堆空间中的对象没有被栈空间变量指向的时候,这个对象会等待被java回收:

jdk

里面是这样实现的:

protected void finalize() throws Throwable { }
}

在这里插入图片描述

源码中显示的

@Deprecated(since="9")

的意思就是说在jdk9以后这个方法就过时了(有其他的方法代替),但还是可以试验下…

测试代码如下:

public class testFinalize
{
	public static void main(String[] args){
	
		Person p = new Person();
		p = null;//此时堆当中的Person对象就没有变量指向了,就变成了垃圾,等到垃圾回收机制调用的finalize()的时候会输出
        //那句话
	}
}

class Person
{

    protected void finalize() throws Throwable{
		
		System.out.println("我快死了!!!");
    }

}

测试了几次,垃圾回收机制都没有启动(这点垃圾她真的看不上)。咱们程序员也不能强制垃圾回收器启动,但是可以适当建议她启动,毕竟人家傲娇得很呢嘛,下面这代码建议她启动(增加垃圾回收器启动的概率)。

public class testFinalize
{
	public static void main(String[] args){
	
		Person p = new Person();
		p = null;
		System.gc();


	}
}

class Person
{

    protected void finalize() throws Throwable{
		
		System.out.println("我快死了!!!");
    }

}

在这里插入图片描述

你看看,你看看,人家还是不理你,看来得拿出点正当的手段了(就好比追女孩子一样,追不到,可以采取一些正当的手段,比如买束花什么的,会加分的吧…咱程序员也懂浪漫~)。改为如下代码:

public class testFinalize
{
	public static void main(String[] args){
	
		Person p = new Person();
		//送点花
		for(int i = 0 ; i< 1000; i++){
		   p = null;	
		}		
		System.gc();//增加垃圾回收器启动的概率
	}
}

class Person
{

    protected void finalize() throws Throwable{
		
		System.out.println("我快死了!!!");
    }

}

在这里插入图片描述

现在就出来了…如果没出来可以把循环增加一下~

看来还是使点手段好用啊!



版权声明:本文为qq_37823003原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。