第227天学习打卡(知识点回顾 弱引用 虚引用)

时间:2021-08-23
本文章向大家介绍第227天学习打卡(知识点回顾 弱引用 虚引用),主要包括第227天学习打卡(知识点回顾 弱引用 虚引用)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

知识点回顾

弱引用

虚引用需要用java.lang.ref.WeakReference类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管JVM的内存空间是否足够,都会回收该对象占用的内存。

假如有一个应用需要读取大量的本地图片:

如果每次读取图片都从硬盘读取则会严重影响性能,如果一次性全部加载到内存可能造成内存溢出。

此时使用软引用可以解决这个问题:

设计思路:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效的避免OOM问题。

 Map<String, SoftReference<BitMap>>imageCache = new HashMap<String, SoftReference<BitMap>>();

 

虚引用

虚引用需要java,lang,ref.PhantomReference类来实现。

虚引用和其他几种引用都不同,虚引用并不会决定对象的声明周期。

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。

虚引用的主要作用是跟踪对象被垃圾回收的状态。仅仅提供了一种确保对象被finalize以后,做某些事情的机制。

PhantomReference的get方法总是返回null,因此无法访问对应的引用对象。其意义在于说明一个对象已经进入finalization阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作。

设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。

java技术允许使用finalize()方法在垃圾收集器将对象从内存中清理出去之前做必要的清理工作。

总结:

java提供了四种引用类型,在垃圾回收的时候,都有各自的特点。

ReferenceQueue是用来配合引用工作的,没有ReferenceQueue一样可以运行。

创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列,如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内被回收之前采取必要的行动,这相当于是一种通知机制。

B站:尚硅谷Java大厂面试题第二季(java面试必学,周阳主讲)哔哩哔哩bilibili

原文地址:https://www.cnblogs.com/doudoutj/p/15178060.html