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, 减少重建他们所需的时间和消耗.

原文地址:https://www.cnblogs.com/zhengtu2015/p/4898507.html