美文网首页
Java四大引用

Java四大引用

作者: wang6771264 | 来源:发表于2019-02-12 16:50 被阅读0次
  • 1.强引用
//直接定义obj强引用
Object obj = new Object();
//基础类型常量,字符池中有赋值的强引用
int m = 4; 
WeakReference e = new WeakReference(4);

  • 2.软引用
  • 描述:

   一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

  • 使用场景

  软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等`。使用软引用能防止内存泄露,增强程序的健壮性。
SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。

Object obj = new Object();
//配合ReferenceQueue使用
ReferenceQueue queue = new ReferenceQueue();
SoftReference srf = new SoftReference(obj, queue);

  • 3.弱引用:(WeakReference)

  弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
  弱引用可以配合WeakHashMap的GC规律创建短暂缓存池。

package com.maple.javaUtility;

import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;

public class WeakHashMapTest {
    public static void main(String[] args) {
        /**
         *  基础类型常量,字符池中有赋值的强引用
         *  int m = 4;
         *  WeakReference e = new WeakReference(4);
         *
         */

        A b = new A(1);
        int m = 4;
        int n = 5;

//        String s2 = new String("SB");
        String s3 = new String("SC");

        WeakReference<A> c= new WeakReference<>(new A(2));
        WeakReference<A> d= new WeakReference<>(new A(3));
        WeakReference e = new WeakReference(new Integer(4));
        WeakReference f = new WeakReference(new Integer(5));
        WeakReference g = new WeakReference(new String("SA"));
        WeakReference h = new WeakReference(new String("SB"));

        WeakHashMap wh = new WeakHashMap();
        wh.put("A", "A");
        wh.put(b, "two");
        wh.put(c.get(), 1);
        wh.put(e.get(), "EEE");
        wh.put(f.get(), "FFF");

        wh.put(g.get(), "GGG");
        wh.put(h.get(), "HHH");


        System.out.println(wh.get(4));
        System.out.println(wh.get(n));

        System.out.println(wh.get("SA"));
        System.out.println(wh.get("SB"));
        System.out.println("-----------------------------spilit-----------------------------");

        System.gc();
        Iterator i = wh.entrySet().iterator();
        while (i.hasNext()) {
            Map.Entry en = (Map.Entry)i.next();
            System.out.println("map:"+en.getKey()+":"+en.getValue());
        }

        System.out.println("-----------------------------spilit-----------------------------");
        b = null;
        System.gc();
        Iterator i2 = wh.entrySet().iterator();
        while (i2.hasNext()) {
            Map.Entry en = (Map.Entry)i2.next();
            System.out.println("map:"+en.getKey()+":"+en.getValue());
        }
    }

    static class A{
        private int x;

        public A(int x) {
            this.x = x;
        }
    }
}

  • 4.虚引用:(PhantomReference)
        虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
        要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
       //虚引用 
        ReferenceQueue<String> queue2 = new ReferenceQueue<>();
        PhantomReference<String> pr = new PhantomReference<>(new String("hello"), queue2);
        System.out.println(pr.get());

相关文章

网友评论

      本文标题:Java四大引用

      本文链接:https://www.haomeiwen.com/subject/zkekeqtx.html