本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作。
[toc]
内存泄漏问题
只要一个对象被引用,它就不会被垃圾回收。
问题出现 及 解决方式
1. 对无用对象的过期引用(obsolet reference)。
- 手动清除对无用对象的过期引用,如果它们以后又被错误地解除引用,程序就会立即抛出
NullPointerException
异常,而不是悄悄地运行下去。 - 清空对象引用应该是一种例外,而不是一种规范行为。【最好的办法是在作用域内定义每一个变量】
- 只要类是自己管理内存,程序员就应该警惕内存泄露问题。
2. 缓存
- 把对象放入缓存中,它很容易被遗忘,可能在不再有用的很长一段时间里仍然留在缓存中。
- 考虑使用
WeakHashMap
代表缓存。【缓存项的生命周期是由该键的外部引用而不是由值决定时】 -
LinkedHashMap
类利用它的removeEldestEntry
方法可以很容易地实现在给缓存添加新条目的时候顺便清理
3. 监听器和其他回调
- 如果你实现了一个API,客户端在这个API中注册回调,却没有显式地取消注册,那么除非你采取某些动作,否则它们就会积聚。
- 最佳方法是只保存它们的弱引用(weak reference),例如,只将它们保存成
WeakHashMap
中的键。
总结
由于内存泄漏通常不会表现成明显的失败,所以它们可以在一个系统中存在很多年。往往只有通过仔细检查代码,或者借助于
Heap
剖析工具(Heap Profiler)才能发现内存泄漏问题。因此,如果能够在内存泄漏之前就知道如何预测此类问题,并阻止它们发生,那是最好不过的了。
网友评论