java: system.gc()和 finalize 的使用情景

本文介绍了Java中finalize方法的用途及注意事项,并通过实例演示了如何利用该方法进行对象终结条件的验证。

 finalize的作用的在进行垃圾回收前,执行的一个方法,这个方法里面不能放回收资源的东西,比如关闭流等,因为这个方法不一定被调用

这个方法只有进行垃圾回收时才被调用

下面这个例子是关于finalize的一个使用情景


package day20150814;

public class Finalize {

	public static void main(String[] args) {
		Check check1 = new Check(),check2 = new Check();
		check1.doChecked();//check1执行方法
		System.out.println("check1:"+check1);
		System.out.println("check2:"+check2);
		check1=null;//失去引用
		check2=null;
		System.gc();//强制gc
		//Runtime.getRuntime().gc();
	}
}

class Check{
	private boolean checked ;
	
	Check(){
		checked=false;
	}
	
	public void doChecked(){
		checked = true;
	}
	
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("finalize");
		if(!checked){
			System.out.println(this+"doChecked没有执行~");
		}else{
			System.out.println(this+"doChecked执行了~~");
		}
		super.finalize();
	}
}


执行结果:

check1:day20150814.Check@3ce53108
check2:day20150814.Check@6af62373
[GC 323K->320K(19648K), 0.0032962 secs]
[Full GC 320K->201K(19648K), 0.0098180 secs]
finalize
day20150814.Check@6af62373doChecked没有执行~
finalize
day20150814.Check@3ce53108doChecked执行了~~


小结:

finalize可以放在类中,作为对象终结条件的验证,在资源被回收时,对一些条件进行判断.

另外system.gc()不会对所有资源都回收,只会回收失去引用的资源,所以要加上check1=null的代码

以下是关于 `finalize()` 方法 `System.gc()` 方法的使用案例,此案例展示了对象如何在垃圾回收过程中尝试“复活”: ```java class FinalizeExample { // 用于保存对象引用 static FinalizeExample SAVE_HOOK = null; public void isAlive() { System.out.println("我还活着呢!"); } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("finalize 方法被调用!"); // 使对象复活 FinalizeExample.SAVE_HOOK = this; } } public class Main { public static void main(String[] args) throws InterruptedException { FinalizeExample example = new FinalizeExample(); // 第一次尝试回收对象 example = null; System.gc(); // 因为 Finalizer 线程优先级低,这里暂停主线程,给 Finalizer 线程执行机会 Thread.sleep(500); if (FinalizeExample.SAVE_HOOK != null) { FinalizeExample.SAVE_HOOK.isAlive(); } else { System.out.println("我已经死了 :("); } // 第二次尝试回收对象 FinalizeExample.SAVE_HOOK = null; System.gc(); // 再次暂停主线程,给 Finalizer 线程执行机会 Thread.sleep(500); if (FinalizeExample.SAVE_HOOK != null) { FinalizeExample.SAVE_HOOK.isAlive(); } else { System.out.println("我已经死了 :("); } } } ``` 在上述代码中,`FinalizeExample` 类重写了 `finalize()` 方法。在 `main` 方法里,首先将 `example` 引用置为 `null`,然后调用 `System.gc()` 触发垃圾回收。由于对象重写了 `finalize()` 方法,在执行该方法时,将 `SAVE_HOOK` 重新指向当前对象,使得对象“复活”。第二次将 `SAVE_HOOK` 置为 `null` 并再次调用 `System.gc()` 时,`finalize()` 方法不会再次执行(因为 `finalize()` 方法只会执行一次),对象最终被回收 [^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值