java清理对象的时候“=null”与“gc”的比较

今天的话题是在清理对象的时候是使用=null还是gc,我们下面做出比较。


1.写这篇文章的缘由

之前我写了一篇文章是对象的清理(点击跳转),有一位网友给了另外一种方法,因此我特意使用visual vm来测试一下看看。



2.使用检测工具 visual vm

下载地址:https://java.net/projects/visualvm/downloads/download/release138/visualvm_138.zip

使用参考文章:

使用 VisualVM 进行性能分析及调优


3.测试用例

下面是使用gc来清理:

package com.ray.ch05;

public class Test {
	public static void main(String[] args) throws InterruptedException {
		Thread.sleep(15000);
		System.out.println("begin time:" + DateUtil.getNow());
		for (long i = 0; i < 1999999999; i++) {
			Test test = new Test();
			// test = null;
			System.gc();
		}
		System.out.println("end time:" + DateUtil.getNow());
	}
}




从上面两个图可以看见,使用gc的时候test所使用的内存比较少,形成的实例非常少,但是由于经常gc,因此cup占用非常高,而且不稳定,还有gc的时间非常长,上面的数据是没有完成所有gc的数据,但是也能说明一些问题。


下面我们来使用=null来清理对象:

代码

package com.ray.ch05;

public class Test {
	public static void main(String[] args) throws InterruptedException {
		Thread.sleep(15000);
		System.out.println("begin time:" + DateUtil.getNow());
		for (long i = 0; i < 1999999999; i++) {
			Test test = new Test();
			test = null;
			// System.gc();
		}
		System.out.println("end time:" + DateUtil.getNow());
	}
}





从上图可以看见,当使用=null来清空对象的时候,cup占用也高,但是比较平稳,内存的使用比gc要高大概25%,生成大量的实例,但是有一个比较明显的优势,就是执行时间短,据笔者观察,当Test的实例到达某个数量的时候,它就会突然下降,个人推测那个时候执行了gc,只是推测,没有实际根据。


总结:其实使用=null的方式并不是真的清空对象,对象只是被回收,需要等到某一个时间才清理,而gc就直接是清理,但是,使用=null的执行速度快,使用gc的执行速度慢。

以上只是笔者粗略的观察,有问题请指出,谢谢。

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-10-28 15:30  李灵晖  阅读(207)  评论(0编辑  收藏  举报