Java中的引用----强软弱虚

强引用(StrongReference)

强引用是使用最普遍的引用。只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象

  Object object =new Object();
  String str ="hello";

如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象,如下:

  object = null;
  str = null;

(总结:平时使用的大部分都是强引用,只要有强引用指向这个对象,对象就不会被回收)

软引用(SoftReference)

软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。只有在内存不足的时候JVM才会回收该对象。

  String str=new String("abc");                                     // 强引用
  SoftReference<String> softRef=new SoftReference<String>(str);     // 软引用

用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

使用软引用实现浏览器网页缓存实例:

        Browser prev = new Browser();               // 获取页面进行浏览
        SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用
        if (sr.get() != null) {
     
            rev = (Browser)sr.get();                // 还没有被回收器回收,直接获取
        } else {
     
            prev = new Browser();                   // 由于内存吃紧,软引用对象被回收
            sr = new SoftReference(prev);           // 重新构建
        }

(总结:软引用就是可以存在但不是必须的对象,只要在内存不足的时候它指向的对象才会被回收掉)

弱引用(WeakReference)

只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

        // 创建一个引用队列
        ReferenceQueue<String> rq = new ReferenceQueue<String>();
        // 实现一个弱引用,将强引用类型hello和是实例化的rq放到弱引用实现里面
        WeakReference<String> sr = new WeakReference<String>(new String("hello"), rq);
        // 通过弱引用get方法获取强引用中创建的内存空间hello值
        System.out.println(sr.get());
        System.gc();                //通知JVM的gc进行垃圾回收
        System.out.println(sr.get());

(总结:弱引用,gc时一但发现就会被回收,ThreadLocal里头使用到了弱引用)

虚引用(PhantomReference)

(系统监控,虚引用指向的对象回收时会收到通知)

  • 虚引用也称为幻影引用,一个对象是都有虚引用的存在都不会对生存时间都构成影响,也无法通过虚引用来获取对一个对象的真实引用。唯一的用处:能在对象被GC时收到系统通知,JAVA中用PhantomReference来实现虚引用

  • 虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

应用: 清理堆外内存 (某个对象关联了一块堆外内存,该对象被回收了,堆外没有回收,就发生了内存泄漏)

给关联了堆外内存的对象挂一个虚引用(虚引用存不存在对系统的内存都没有影响)。虚引用的特点就是该对象被回收后,会收到系统的消息。把消息放入队列,然后清理这个对象相关的堆外内存。
Java中的引用----强软弱虚_第1张图片Java中的引用----强软弱虚_第2张图片Java中的引用----强软弱虚_第3张图片
(总结:虚引用都get不到对象,它唯一的特点就是它指向的对象被回收时会收到系统通知,因此可以作为系统监控,会配合引用队列使用(例如回收堆外内存)

你可能感兴趣的:(java基础,java)