您的位置:首页 > 编程语言 > Java开发

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

2015-10-28 15:30 375 查看
今天的话题是在清理对象的时候是使用=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的执行速度慢。
以上只是笔者粗略的观察,有问题请指出,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java