![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a1c7b22715a9fde348bf68241efc5dae.png)
一、强引用(Refrence)
- 当内存不足的时候,JVM开始垃圾回收,对于强引用对象,就算是出现OOM也不会对该对象进行回收。
- 既该对象永远都不会被GC所回收,所以呢强引用是造成java内存泄漏的主要原因直一。
二、软引用(softRefrence)
- 当内存足够时,可以被当做强引用,不会被回收。但是当系统内存不足时,就会被GC 回收
- 用处:通常 用在堆内存敏感的程序中,比如 高级缓存中,内存足够就保留,内存不够就回收。
三、弱引用(weakRefrence)
- 如果只是弱引用的对象,一旦被GC所扫描到,不管内存是否足够都会回收。
- 如果这个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象。
- WeakHashMap
- 当我们使用普通的HashMap时,将其key设置为null时GC并不会回收其value值,而使用WeakHashMap时,我们将其key设置为null 时GC 会将其value 回收
**//HashMap<Integer, String> map = new HashMap<>();
WeakHashMap<Integer, String> map = new WeakHashMap<>();
Integer key = new Integer(1);
String value = "hashMap";
map.put(key, value);
System.out.println(map);
//使用普通HashMap的结果
key = null;
System.out.println(map);
//使用weakHashMap后的结果
System.gc();
System.out.println(map);**
四、虚引用(phantomRefrence)
- 顾名思义,就是形同虚设,与其他引用不同,他不会对对象的生命周期产生影响。
- 如果一个对象只有虚引用,那么就和没有引用一样,在任何时候都可能被被GC回收,他不能单独使用,也不能通过它访问对象(使用get()方法只会返回null),虚引用必须和引用队列联合使用
- 设置虚引用的唯一目的,就是在该对象被回收时收到系统通知,或进行进一步处理
- 引用队列(RefrenceQueue):简单来说就是当发生GC时(已经被GC掉了),把该对象加入到引用队列中去
Object o = new Object();
ReferenceQueue<Object> objectReferenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>(o, objectReferenceQueue);
System.out.println("GC之前");
System.out.println(o);
System.out.println(phantomReference.get());
System.out.println(objectReferenceQueue.poll());
System.out.println("===============");
o = null;
System.gc();
Thread.sleep(500);
System.out.println("GC之后");
System.out.println(o);
System.out.println(phantomReference.get());
System.out.println(objectReferenceQueue.poll());
总结
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2a4b7bb5d49e0e93c5abe16c29b94662.png)