【java基础】二、Java的强软弱虚四种引用及引用队列

202 阅读2分钟

Java的强软弱虚四种引用

1.强引用

强引用就是指例如 Object obj = new Object() 这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。当强引用不再使用时可通过显示的设置为null来弱化引用,以便GC回收。

2.软引用SoftReference

如果一个对象只具有软引用,当内存空间足够时,垃圾回收器不会回收它;如果内存空间不足了,就会回收这些对象的内存。软引用可用来实现内存敏感的高速缓存。

     HashMap<String,SoftReference<Content>>

3.弱引用WeakReference

弱引用与软引用的区别在于:具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

WeakHashMap<Coupon,List<WeakReference<User>>>

WeakHashmap业务场景就是缓存,可以有效的节省内存,缓存丢失也不会出太大问题,可以再次获取。 ThreadLocalMap 里 Entry 的 key 也使用的弱引用 WeakReference

4.虚引用 PhantomReference

“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于**:虚引用必须和引用队列(ReferenceQueue)联合使用**。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

引用队列 ReferenceQueue

引用队列是用来配合引用工作的,没有ReferenceQueue一样可以运行。创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列,这相当于是一种通知机制。当关联的引用队列中有数据的时候,意味着引用指向的堆内存中的对象被回收。通过这种方式,JVM允许我们在对象被销毁后,做一些我们自己想做的事情。JVM提供了一个ReferenceHandler线程,将引用加入到注册的引用队列中