强引用、软引用、弱引用、虚引用

强引用

普通的new一个对象比如,Object obj = new Object(),obj就是强引用,一个对象只要被强引用指向,那么这个对象就不会被回收。

软引用

软引用相对强引用要弱化一些,当对象有弱引用而无强引用关联时,当内存空间足够的时候,垃圾回收器不会回收它。适合用在缓存的应用场景中,如果内存充足,则可以缓存业务数据,如果内存不够则可以将其指向的对象回收。

弱引用

在垃圾回收时,如果这个对象只被弱引用关联(没有任何强引用关联他),不管内存空间是否有空闲,都会被回收。弱引用同样可以应用在很多需要缓存的场景。(ThreadLocal类中的ThreadLocalMap使用的弱引用来作为key)

虚引用

虚引用和弱引用对关联对象的回收都不会产生影响,如果只有虚引用活着弱引用关联着对象,那么这个对象就会被回收。不同的是无法通过虚引用来获取一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。所以虚引用必须配合ReferenceQueue使用,来接收通知,监视对象状态。

ReferenceQueue:有对象即将被回收,那么相应的reference对象就会被放到这个queue里,这也就意味着,该对象的引用一旦被放入到referencequeue,就表明该对象即将被回收了。

总结一览

强引用、软引用、弱引用、虚引用