Java的四种引用类型与 GC回收时间

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类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。在回收时会发一个通知(具体什么通知还没研究)




猜你喜欢

转载自blog.csdn.net/doujinlong1/article/details/80516178
今日推荐