美文网首页
Android面试Java基础篇(四)

Android面试Java基础篇(四)

作者: 肖义熙 | 来源:发表于2021-03-23 16:17 被阅读0次
问:Java中四种引用类型

答:四种引用类型分别为 强引用、弱引用、软引用、虚引用

  1. 强引用(StrongReference):强引用是最为普遍和使用最多的一种引用方式,如果一个对象具有强引用,当内存不足时,虚拟机宁愿抛出OOM异常结束应用,也不会去回收这个对象。例如:A a = new A() 即a对象具有强引用。
  2. 弱引用(WeakReference):只具有弱引用的对象在垃圾回收线程扫描其所管辖的内存区域时,不管当前内存是否不足都会直接回收它的内存。弱引用可以和引用队列(ReferenceQueue)结合使用,弱引用对象内存回收前,会将当前引用加入到引用队列中
  3. 软引用(SoftReference):只具有软引用的对象在垃圾回收线程扫描其所管些的内存区域时,会判断当前内存是否不足,如果当前内存不足则回收软引用对象的内存,如果当前内存足够,则不回收。软引用可以和引用队列(ReferenceQueue)结合使用,软引用对象内存回收前,会将当前引用加入到引用队列中
  4. 虚引用(PhantomReference):如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动,必须配合引用队列(ReferenceQueue)联合使用,虚引用对象内存回收前,会将当前引用加入到引用队列中。
问:Handler、AsyncTask、Thread之类的内存泄漏优化为何选弱引用而不用软引用

答:以Handler为例,Handler发生内存泄漏是因为非静态内部类持有外部类Activity的引用,Activity退出时,长生命周期的Handler任然可能持有对Activity的引用,导致Activity无法被回收,导致内存泄漏。在activity线程的GC过程中遇到软引用不一定会对其进行回收,只有内存紧张的情况才开始回收,并且是优先回收较久远的activity,所以如果使用弱引用也可能会引起内存泄漏。

相关文章

网友评论

      本文标题:Android面试Java基础篇(四)

      本文链接:https://www.haomeiwen.com/subject/tfjfhltx.html