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 - [email protected]
Object is alive for 63586 loops - [email protected]
Object is alive for 63587 loops - [email protected]
Object is alive for 63588 loops - [email protected]
Object is alive for 63589 loops - [email protected]
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, 减少重建他们所需的时间和消耗.

时间: 2024-11-03 21:58:38

WeakReference java的相关文章

Java和C#基本类库的区别

java.lang java .net Boolean System.Boolean Byte System. Byte Character System.Char Class System.Type Double System.Double Float System.Single Integer System.Int32 Long System.Int64 Math System.Math Object System.Object Process System. Diagnostics .Pr

Java Reference &amp; ReferenceQueue一览

Overview The java.lang.ref package provides more flexible types of references than are otherwise available, permitting limited interaction between the application and the Java Virtual Machine (JVM) garbage collector. It is an important package, centr

理解Java中的弱引用(Weak Reference)

理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:) 1. What——什么是弱引用? Java中的弱引用具体指的是java.lang.ref.WeakReference<T>类,我们首先来看一下官方文档对它做的说明: 弱引用对象的存在不会阻止它所指向的对象变被垃圾回收器回收.弱引

JAVA API与.NetAPI

C# 搜索  .NET Framework 类库 java.lang包 java.lang java .net Boolean System.Boolean Byte System. Byte Character System.Char Class System.Type Double System.Double Float System.Single Integer System.Int32 Long System.Int64 Math System.Math Object System.Ob

?C# 搜索 .NET Framework 类库

java.lang包 java.lang java .net Boolean System.Boolean Byte System. Byte Character System.Char Class System.Type Double System.Double Float System.Single Integer System.Int32 Long System.Int64 Math System.Math Object System.Object Process System. Diag

大猫品Android[三][Reference深入浅出]

写在前面: Reference本身是一个接口,表示一个引用,不能直接使用,有四个它的派生类供我们使用,它们分别是:SoftReference,WeakReference,PhantomReference,FinalizerReference .其中SoftReference,WeakReference和 PhantomReference的区别与使用Google一下已经有大把的介绍资料,因此本文对此只简单说明带过,主要给大家介绍你不知道的Reference. 一. SoftReference So

引用与垃圾回收

reference /'ref?r?ns/ an indicator that orients you generally java.lang.ref.Reference<T> Abstract base class for reference objects. This class defines the operations common to all reference objects. Because reference objects are implemented in close

ThreadLocal中优雅的数据结构如何体现农夫山泉的广告语

本篇文章主要讲解 ThreadLocal 的用法和内部的数据结构及实现.有时候我们写代码的时候,不太注重类之间的职责划分,经常造出一些上帝类,也就是什么功能都往这个类里放.虽然能实现功能但是并不优雅且不好维护.这篇文章就介绍 ThreadLocal 中如何设计优雅的数据结构以及类之间的职责划分,至于怎么跟农夫山泉广告语扯上关系,相信你读完便有了答案,文末也有解释. 用法 ThreadLocal 对象可以当做每个线程局部变量.也就是不同线程同时读写同一个 ThreadLocal 对象,其实操作的是

Java WeakReference的理解与使用

前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他. 无疑, 在interviewer眼中, 对于weak referen