java对象四种引用原理

I、java对象引用的介绍
jdk1.2以前,当对象没有指向它的引用的时候,这个对象就会被gc回收,但有时候咱们须要拿回来使用,又没有了其引用,只能从新构建一个对象,若优化的话就作HashMap去缓存到内存,但若对象构建消耗的代价高或者数量比较多的时候,内存就oom。jdk1.2后,java把对象的引用分为了4种级别,使得程序可以灵活的控制对象的生命周期:
    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。


相关文章
相关标签/搜索