ARTS 打卡 Week 05
每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
Algorithm
LC 94: 二叉树的中序遍历
Review
Weak, Soft, and Phantom References in Java (and Why They Matter)
为什么要有这些引用类型?
GC是发明用来简化手动内存管理的;引用类型是语言释放出的接口,让开发者与其GC“协作”的。
不同引用类型定义:
Strong Reference: 只要强引用还存在,GC永远不会回收被引用的对象。
SoftReference: 软引用用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。
WeakReference: 弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存在下一次垃圾收集发生之前。当GC工作时,无论当前内存是否足够,都会回收只被弱引用关联的对象。
PhantomReference: 幽灵引用是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在对象呗GC回收时收到一个系统通知。
引用类型的使用场景:
SoftReference
实现内存cache
SoftHashMap: map的k-v映射通过SoftReference实现
WeakReference
WeakHashMap
引用大对象,比如Android中的context对象
PhantomReference
监控内存泄露,如LeakDetector
Android Libcore中对SoftReference的测试case之一,就是构造一个OOM,然后再去判断引用的对象是否为null。
Tips
Share
最近在进行iOS开发时,碰到一个奇怪的问题:明明给某个controller的weak property赋值了,但是这个property在用的时候确是nil,改成strong的话就没有问题。
打断点跟了一下,发现原来是我在一个函数内部创建了property对象,并赋值给controller,当方法结束时,这个property因为是方法局部变量且没有对它的强引用,因此被回收掉了。
同样的情况,在Java中是不会回收的(当然Java默认是强引用)。写这段代码时,我确实有点“Java思维”了。
评论 (2 条评论)