不积跬步,无以至千里;不积小流,无以成江海。

 

Java语言基础

 

Java的对象销毁:

Java的内存清理是通过垃圾回收器进行的,当垃圾回收器准备回收对象内存的时候,首先会调用对象的finalize()方法,并且在下一次垃圾回收动作发生的时候真正回收对象的内存。既然会调用对象的这个方法就说明所有的类都会有这个方法(因为所有的类都可能会被回收)。

先看Java的根类 Object:

protected void finalize() throws Throwable { }

这是一个实现为空的方法,既然是protected就说明具体的方法可以留给子类去实现。

我们也知道当对象不再被任何引用指向时候,该对象才会被回收。那么具体情况如何呢?

class User {
	
	private int money;

	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}
	
	public void cool() {
		System.out.println("Money!");
	}
	
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();
		System.out.println("finalize methode executed");
		System.out.println(this);
	}
}

我们重写了finalize()方法,接着对其进行测试:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		User user = new User();
		System.out.println(user);
		user = null;
		System.out.println(user);

		new User();		
	}

}

程序输出:

User@15db9742
null

我们发现运行结束之后,user并没有被回收,就连没有任何引用指向的new User()也没有被回收。

Thinking In Java中是这样解释的:Java中的并非总是被垃圾回收,也就是说对象可能不被回收。一般程序只要不到濒临存储空间用光,垃圾回收器一般都不会主动回收内存,如果程序结束,并且垃圾回收器一直没有释放你创建的空间,则随着程序的退出,资源则会被归还给操作系统。所以上面的我们finalize()才一直没有被调用。

这里我们可以使用System.gc(),强制系统垃圾回收器工作:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		User user = new User();
		System.out.println(user);
		user = null;
		System.out.println(user);
		System.gc();	
	}
}

程序输出:

User@15db9742
null
finalize methode executed
User@15db9742

可以看到创建的对象user被回收了。

 

 

博客借鉴:https://www.jianshu.com/p/993b046a40b6

posted on 2020-04-10 19:45  smile学子  阅读(295)  评论(0编辑  收藏  举报