什么是过时引用
对象的引用被栈维护,且永远不会解除,这个对象将排除在垃圾回收之外,且该对象引用的其他对象亦是如此
什么是内存泄露
分配内存后无法释放内存并且有过时的引用,就会发生内存泄露
我们为什么要避免内存泄露
- 当维护对象的过期引用时会出现内存泄露
- 由于内存占用的增加,性能会下降,极端情况下会导致磁盘分页,甚至内存溢出
如何解决对象保留问题
一旦对象的引用过期,将他们设置为null,设置为null的另一个好处是,如果它们随后被错误的引用,将抛出 NullPointerException 异常
取消过期引用应该是例外而不是规范
程序员不应该在程序结束后立即清空所有对象引用,这是不必要的,也是不可取的,消除过期引用的最好办法是包含引用的变量超出范围,简单来说就是最小化局部变量作用域的最强大的技术是在首次使用的地方声明它,我们应该在尽可能窄的范围内定义每个变量。
什么时候我们应该删除引用
- 当元素变成非活动时,元素中包含的任何对象引用都应该被清除
- 当我们将对象引用放入缓存并将其保留在那里时,经过很长一段时间,它将变得无关紧要,或已经被遗忘,我们偶尔应该使用Timer或ScheduledThreadPoolExecutor来清理废弃的条目
- 注册回调时,我们更倾向于显示注销它们,最好的方法是存储在WeakHashMap中来仅存储对他们的弱引用
- 使用分析器调试工具来发现内存泄漏,预见和防止是非常有必要的