强引用(Strong Reference)
正常使用的引用就是强引用,强引用对象指向的对象不会被垃圾回收器回收
弱引用(Weak Reference)
Java中的弱引用具体指的是java.lang.ref.WeakReference<T>类
弱引用对象的存在不会阻止它所指向的对象变被垃圾回收器回收。弱引用最常见的用途是实现规范映射(canonicalizing mappings,比如哈希表)。
假设垃圾收集器在某个时间点决定一个对象是弱可达的(weakly reachable)(也就是说当前指向它的全都是弱引用),这时垃圾收集器会清除所有指向该对象的弱引用,然后垃圾收集器会把这个弱可达对象标记为可终结(finalizable)的,这样它们随后就会被回收。与此同时或稍后,垃圾收集器会把那些刚清除的弱引用放入创建弱引用对象时所登记到的引用队列(Reference Queue)中。
比如说在hashMap中当一个key指向的对象已经做完工作了不需要存在时,需要把它回收掉,然而hashMap中的key是强引用,强引用对象指向的对象不会被垃圾回收器回收,这个时候就需要将key设置为弱引用。
WeakHashMap
就是这样的一个实现,Entry继承了弱引用,Entry对象即是一个弱引用对象,在它的构造器中Entry弱引用的就是key,当实际的key对象已经没有任何强引用了(只剩下弱引用key),key对象就会被垃圾回收
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {
V value;
final int hash;
Entry<K,V> next;
/**
* Creates new entry.
*/
Entry(Object key, V value,
ReferenceQueue<Object> queue,
int hash, Entry<K,V> next) {
super(key, queue);
this.value = value;
this.hash = hash;
this.next = next;
}
基本使用
Object obj = new Object();
WeakReference<Product> weakProductA = new WeakReference<>(obj);
获取obj只需要使用get方法即可
Object obj = weakProductA.get();
软引用(Soft Reference)
软引用跟弱引用一样,软引用对象的存在也不会阻止它所指向的对象变被垃圾回收器回收。区别在于软引用可达的对象只有内存不足时会被回收,而弱引用可达的对象无论内存是否充足都会被回收。