1)强引用。强引
用是最广泛的,当一个对象有强引用的的时候,其不会被gc回收,无论内存足够仍是不足够。
2)软引用。SoftReference类,类内包含指定对象的引用,当一个对象只有软引用的且内存不足的时候,对象会被gc回收,能够配合ReferenceQueue队列使用,若对象被回收,则会把SoftReference内指定对象的引用置为null,SoftReference对象会进入ReferenceQueue,经过对ReferenceQueue使用poll方法来判断指定对象是否被gc回收。
3)弱引用。WeakReference类,类内包含指定对象的引用,当一个对象只有弱引用的时候,无论内存足仍是不足,都会gc回收,
能够配合ReferenceQueue队列使用,
经过对ReferenceQueue使用poll方法来判断指定对象是否被gc回收,第一次回收会被标记为垃圾回收,用get有可能获取到对象,第二次gc会被回收,用get返回空。
当弱引用的指向对象变得弱引用可到达,该弱引用就会加入到引用队列。这一操做发生在对象析构或者垃圾回收真正发生以前,能够在不规范的finalize方法里从新添加指向对象的引用,复活对象。
4)虚引用。PhantomReference类,当一个对象只有弱引用的时候,任什么时候候都会被gc回收。经过get获取永远都为空。虚引用用来判断和跟踪对象是否被回收,并且必须和ReferenceQueue联合使用。虚引用能够避免不少析构方法带来的问题。重写析构函数,gc第一次会标记其为垃圾,由于调用析构函数的线程优先级是很低的,故不知道须要通过多少个gc周期才能回收到对象,这就容易发生内存泄漏,使用虚引用则能够判断对象是否真正被gc回收,避免这个问题。
II、java引用的场景
1)由于软引用的特性,在内存不足的时候才去回收只有软引用指向的对象,故适合作高速缓存,当用户去访问 某些数据时,从数据库里拉回数据后,创建软引用会缓存那些常常去查询的数据(不多改动,如新闻,文章等),当用户再次去访问的时候,就从缓存里获取,没必要再从数据库里获取。
2)弱引用
其中一个应用场景是当应用实现了自定义的classLoader,当没有对象指向classLoader的时候,则回收classLoader。