Java中对于对象都是通过引用进行操作的,而Jvm也可以通过引用类型来进行回收内存中的对象,最近刚好有了解到这方面,记一下,一起学习。
引用分为四种:1,强引用,2,软引用,3,弱引用,4,虚引用。
1,强引用。
就是最常用的Object obj = new Object(); obj就是一个强引用,当这个引用存在时JVM直到内存耗尽都不会回收,宁可报OOM。所以一般需要obj = null;这样才会回收。
2,软引用。
如果一个对象是软引用,当如果内存空间不足时才会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。
使用软引用能防止内存泄露,增强程序的健壮性。
SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。
也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。
使用:
Object obj = new Object();
SoftReference<Object> softRef=new SoftReference(obj);
Object otherObj = softRef.get();//一旦垃圾线程回收该Java对象之后get()方法将返回null。
3,弱引用。
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
2 和 3 的区别:
软引用关联的对象只有在内存不足时才会被回收,而被弱引用对象在JVM进行垃圾回收时总是被回收。
4,虚引用
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。在回收时会发一个通知(具体什么通知还没研究)