参考的资料:1.《码》P251 2. DIY第11次讨论问题
强引用 - Strong Reference
用于变量的声明和定义。GC Roots可达,Java内存回收时,不会回收该对象(即使濒临内存耗尽)
软引用 - Soft Reference
用在非必需对象的场景。即将OOM之前(内存不足的时候)GC会进行回收,以获得更多的内存空间。用于高速缓存(缓存服务器中间计算结果及不需要实时保存的用户行为等)
弱引用 - Weak Reference
也用在非必需对象的场景。系统启动GC时或下一次YGC时就会被回收,所以回收的时间具有不确定性,应用于WeakHashMap、ThreadLocalMap的Entry适用于缓存比较不敏感信息,与HashMap相比WeakHashMap在保存key后(key值不能有其他引用),GC后WeakHashMap就会自动删除该key相关的key-value对,整个map的大小也会有所变化。使用get方法时要注意空指针。
虚引用 - Phantom Reference
是一种极弱的引用关系,定义完成后,就无法通过该引用获取指向的对象。目的是被回收时会收到一个系统通知。虚引用必须与引用队列联合使用,当垃圾回收时,如果发现存在虚引用,就会在回收对象内存前,把这个虚引用加入到引用队列中。