强引用
强引用就是最普通的引用,只要一个对象存在一个强引用,就证明它还活着,它就不能被垃圾回收器回收
软引用
软引用存在的意义是什么呢?
对于如下场景,我们想实现一个本地缓存,但是如果在短时间内有大量对象被放入了缓存会发生什么问题呢?内存溢出。
那我们怎么解决这个问题呢?如果能在内存溢出前把缓存的对象给回收了就好了。
对,但怎么实现这一机制呢?嗯,加个软引用吧,我们就把软引用定义成平时不回收,内存溢出前可以被回收的引用类型。
对,软引用就这么出来了。
弱引用
我的机器内存很敏感,我想让缓存的对象平时也可以被回收,但它没被回收前我还可以通过一个引用访问到它,该怎么实现呢?
。。。算了,再加个弱引用吧。
虚引用
我想监控一下我创建的对象被 jvm 垃圾回收的情况,用 finalize 太影响 GC 性能,有没有更好的方法呢?
要是垃圾回收时,回收了那个对象,然后就给我发个消息,说这个对象被回收了哈,该收尸的赶紧来收尸,但我还是照样回收它就好了?
那我们增加个虚引用好了,只不过得到虚引用时对象已经被回收了,所以通过虚引用就访问不到了,但能得到这个对象被回收的消息就好了,其他的也不在乎了。
总结
强软弱虚,引用强度依次减弱。