谈谈强引用,软引用,弱引用,幻象引用有什么区别

在java语言中,除了基本数据类型以外,其他的引用都是各类对象的引用,根据生命周期的长短,分为以下四类:

强引用:我们new的对象所关联的引用就是强引用,当jvm内存空间不足时,宁肯抛出oom运行时错误,也不会将该引用回收来解决内存不足的问题。除非将其赋值为null或者超过引用的作用范围,该引用指向的对象才会被回收。

软引用:通过SoftReference类来实现,软引用的生命周期比强引用短,只有在jvm抛出OOM之前,才会将该引用指向的对象回收。软引用可以和一个引用队列配合使用,如果软引用指向的对象被垃圾回收器回收,jvm就会把这个软引用加入到引用队列中,后面我们可以调用ReferenceQueue的poll方法来检查是否有我们关心的对象被回收,如果队列为空,则返回一个null,否则返回reference对象。

弱引用:通过WeakReference类来实现,弱引用的生命周期比软引用短,在垃圾回收器扫描它所负责的内存区域的过程中,一旦发现有弱引用的对象,无论当前内存空间是否足够,都会将该引用所指向的对象回收。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快的将其回收,所以我们也可以将弱引用配合引用队列来使用,如果弱引用指向的对象被垃圾回收器回收,jvm就会把这个弱引用加入到引用队列中,后续我们好判断我们所关心的弱引用指向的对象是否被回收。

幻象引用:幻象引用也叫虚引用,通过PhantomReference类来实现。我们无法通过虚引用访问它所指向对象的任何属性和方法,如果一个对象仅仅持有虚引用,那么 它就和没有任何引用一样,随时可能被垃圾回收器回收,因此必须搭配引用队列来使用,当垃圾回收期准备回收一个对象时,如果发现它还有虚引用,那么就在回收之前将它放入引用队列并采取操作。

猜你喜欢

转载自www.cnblogs.com/peng1234/p/13406172.html