java垃圾回收机制

java强制垃圾回收:

利用System类的静态gc()静态方法

或者利用Runtime对象的gc()实例方法:Runtime.getRintime().gc();

 

/*
* @author jack.chen
* @version 创建时间:2018年7月20日 下午9:59:41
* 类说明:java强制垃圾回收:
*/
public class TestGc {
	private double height;
	public static void main(String[] args) {
		for(int i=0;i<4;i++)
		{
			new TestGc();
			//下面两行代码的作用完全相同,强制系统进行垃圾回收
			//System.gc();
			Runtime.getRuntime().gc();
		}
	}
	public void finalize() {
		System.out.println("系统正在清理TestGc对象的资源...");
	}
}

然后,可以使用

java -verbose:gc TestGc

命令来监视垃圾回收之前之后的内存占用对比

如:[Full GC 196K->134K(1984K),0.0100485 secs]

三个带有K的数据分别代表的是垃圾回收前对象占用的内存、之后对象占用的内存 以及 系统堆占用的内存大小

finalize方法详解:

当垃圾回收机制回收某个对象所占用的内存之前,通常要求程序调用适当的方法来清理资源,在没有明确指定资源清理的情况下,Java提供了默认机制来清理该对象的资源,这个方法就是finalize()方法。

该方法是定义在Object类的实例方法,方法原型为:

protected void finalize() throws Throwable   //表示可以抛出任何异常,可被任何类所覆盖

注意:
此方法是由java垃圾回收机制自动调用的,并且在何时被调用具有不确定性,也有可能没有被调用;

当JVM去执行此方法时,如果出现了异常,垃圾回收机制不会报告异常,程序继续执行;

当JVM执行去活对象的finalize方法时,可能使该对象或系统中的其他对象重新变成激活状态。

下面演示如何在finalize方法中将自身对象复活,并且可以通过该程序看出垃圾回收的不确定性
 

public class TestFinalize{
    private static TestFinalize tf = null;
    public void info(){
        System.out.println("测试资源清理的finalize方法");
    }
    public static void main(String[] args){
        //创建一个TestFinalize对象立即进入去活状态(有引用变量引用的才是激活状态)
        new TestFinalize();  
        //通知系统进行资源回收 
        System.gc();   //①
        //强制让程序暂停2秒    
        Thread.sleep(2000);   //② ,很重要!!去掉会报错
        tf.info();
    }
    public void finalize(){
        //让tf引用到试图回收的去活对象,即去活对象重新变成激活状态
        tf = this;
    }
}

上述类重写了finalize方法,在该方法中把需要清理的去活对象重新赋给tf引用变量,从而使该去活对象重新变成激活状态。

除此之外,System和Runtime类里面都提供了一个runFinalization方法,可以强制垃圾回收机制调用系统中的去活对象的finalize方法。因此,可以将上述程序改为下面的形式:

public class TestFinalize{
    private static TestFinalize tf = null;
    public void info(){
        System.out.println("测试资源清理的finalize方法");
    }
    public static void main(String[] args){
        //创建TestFinalize对象立即进入去活状态
        new TestFinalize();
        //通知系统进行资源回收
        System.gc();
        //强制垃圾回收机制调用去活对象的finalize方法
        Runtime.getRuntime().runFinalization();   //①
        //System.runFinalization();    //②
        tf.info();
    }
    public void finalize(){
        //让tf试图引用回收的去活对象,即去活对象重新变成激活
        tf = this;
    }
}

上述程序中,不再让系统暂停,①与②行代码具有相同的功能。

你可能感兴趣的:(java学习笔记)