• WeakReference java


    在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 2)GC被运行.

    在现实情况写代码的时候, 我们往往通过把所有指向某个对象的referece置空来保证这个对象在下次GC运行的时候被回收 (可以用java -verbose:gc来观察gc的行为)

    public class Car {
    
    	private double price;
    	  private String colour;
    	  
    	  public Car(double price, String colour){
    	    this.price = price;
    	    this.colour = colour;
    	  }
    	  
    	  public double getPrice() {
    	    return price;
    	  }
    	  public void setPrice(double price) {
    	    this.price = price;
    	  }
    	  public String getColour() {
    	    return colour;
    	  }
    	  public void setColour(String colour) {
    	    this.colour = colour;
    	  }
    	  
    	  public String toString(){
    	    return colour +"car costs $"+price;
    	  }
    	  
    }
    

      

    public class TestWeakReference {
    
    	 public static void main(String[] args) {
    		    
    		    Car car = new Car(22000,"silver");
    		    WeakReference<Car> mWeakCar = new WeakReference<Car>(car);
    		    
    		    int i=0;
    		    
    		    while(true){
    		      if(mWeakCar.get()!=null){
    		        i++;
    		        System.out.println("Object is alive for "+i+" loops - "+mWeakCar);
    		      }else{
    		        System.out.println("Object has been collected.");
    		        break;
    		      }
    		    }
    		  }
    
    	
    }
    

    运行结果:

    Object is alive for 63585 loops - java.lang.ref.WeakReference@659e0bfd
    Object is alive for 63586 loops - java.lang.ref.WeakReference@659e0bfd
    Object is alive for 63587 loops - java.lang.ref.WeakReference@659e0bfd
    Object is alive for 63588 loops - java.lang.ref.WeakReference@659e0bfd
    Object is alive for 63589 loops - java.lang.ref.WeakReference@659e0bfd
    Object has been collected.
    

       

    WeakReference的一个特点是它何时被回收是不可确定的, 因为这是由GC运行的不确定性所确定的. 所以, 一般用weak reference引用的对象是有价值被cache, 而且很容易被重新被构建, 且很消耗内存的对象.

    ReferenceQueue

    在weak reference指向的对象被回收后, weak reference本身其实也就没有用了. java提供了一个ReferenceQueue来保存这些所指向的对象已经被回收的reference. 用法是在定义WeakReference的时候将一个ReferenceQueue的对象作为参数传入构造函数.

    其他类型的references

    -SoftReference

    soft reference和weak reference一样, 但被GC回收的时候需要多一个条件: 当系统内存不足时(GC是如何判定系统内存不足? 是否有参数可以配置这个threshold?), soft reference指向的object才会被回收. 正因为有这个特性, soft reference比weak reference更加适合做cache objects的reference. 因为它可以尽可能的retain cached objects, 减少重建他们所需的时间和消耗.

  • 相关阅读:
    判断
    迭代器
    如何关闭弹框以外的区域来关闭弹框?
    如何使APP端的滑动事件兼容PC端?
    获取元素相对于视窗的位置?
    如何获取一个元素没有在style和样式表中设置的样式的值?
    如何寻找一个数值数组中的最大元素?
    table表格中字母和数字如何换行?
    js中将字符串作为函数名来调用的方法
    web开发中如何使用引用字体
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/4898507.html
Copyright © 2020-2023  润新知