Java根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、虚引用。
-
强引用:就是我们平时 new一个对象的引用。当JVM的内存空间不足时,宁愿抛出OutOfMemoryError使得程序异常终止,也不愿意回收具有强引用的存活着的对象。
-
软引用:生命周期比强引用短,当JVM认为内存空间不足时,会试图回收软引用指向的对象,也就是说在JVM抛出OutOfMemoryError之前,会去清理软引用对象,适合用在内存敏感的场景。
-
弱引用:比软引用还短,在GC的时候,不管内存空间足不足都会回收这个对象,ThreadLocal中的 key 就用到了弱引用,适合用在内存敏感的场景。
-
虚引用:如果一个对象仅持有虚引用,它就和没有任何引用一样,在任何时候都可能被垃圾回收。唯一作用就是配合引用队列来监控引用的对象是否被加入到引用队列中,也就是可以准确的让我们知晓对象何时被回收。