zoukankan      html  css  js  c++  java
  • 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的执行速度慢。

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

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

  • 相关阅读:
    实现一个基于tcc/tlink的简单的编译链接工具
    从函数指针数组的运用来看程序结构化设计(2)
    从函数指针数组的运用来看程序结构化设计
    crypt()函数
    PHP fopen()函数 打开文件
    PHP 数据库访问
    php中图像处理的常用函数
    PHP Cookie的用法
    Spring的依赖注入
    拦截器
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4944465.html
Copyright © 2011-2022 走看看