Java 四种引用方式的区别

强引用(StrongReference)

只要某个对象有强引用与之相关联,JVM一定不会回收这个对象,当内存不足时宁愿抛出OOM异常也不会去回收这个对象。

Object object = new Object();



软引用 (SoftReference)

软引用主要是用来描述一些有用但不是必须的对象,很适合用来用做缓存。对于软引用关联的对象,JVM只有当内存不足才会回收。

  WeakReference sr = new WeakReference(new String("hello"));



弱引用 (WeakReference)

弱引用主要用来描述非必需对象,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

   WeakReference sr = new WeakReference(new String("hello"));



虚引用(PhantomReference)

如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。



进一步理解软引用和弱引用

对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。针对上面的特性,软引用适合用来进行缓存,当内存不够时能让JVM回收内存,弱引用能用来在回调函数中防止内存泄露。因为回调函数往往是匿名内部类,隐式保存有对外部类的引用,所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类,那么就会内存泄露,因为匿名内部类保存有对外部类的强引用。

你可能感兴趣的:(Java 四种引用方式的区别)