强引用(StrongReference)
只要某个对象有强引用与之相关联,JVM一定不会回收这个对象,当内存不足时宁愿抛出OOM异常也不会去回收这个对象。
Object object = new Object();
软引用 (SoftReference)
软引用主要是用来描述一些有用但不是必须的对象,很适合用来用做缓存。对于软引用关联的对象,JVM只有当内存不足才会回收。
WeakReference<String> sr = new WeakReference<String>(new String("hello"));
弱引用 (WeakReference)
弱引用主要用来描述非必需对象,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
WeakReference<String> sr = new WeakReference<String>(new String("hello"));
虚引用(PhantomReference)
如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
进一步理解软引用和弱引用
对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。针对上面的特性,软引用适合用来进行缓存,当内存不够时能让JVM回收内存,弱引用能用来在回调函数中防止内存泄露。因为回调函数往往是匿名内部类,隐式保存有对外部类的引用,所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类,那么就会内存泄露,因为匿名内部类保存有对外部类的强引用。