《Effective Java 中文版 第二版》第二章 第6条:消除过期的对象引用

本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作。


[toc]

内存泄漏问题

只要一个对象被引用,它就不会被垃圾回收。

问题出现 及 解决方式

1. 对无用对象的过期引用(obsolet reference)。

  • 手动清除对无用对象的过期引用,如果它们以后又被错误地解除引用,程序就会立即抛出NullPointerException异常,而不是悄悄地运行下去。
  • 清空对象引用应该是一种例外,而不是一种规范行为。【最好的办法是在作用域内定义每一个变量】
  • 只要类是自己管理内存,程序员就应该警惕内存泄露问题。

2. 缓存

  • 把对象放入缓存中,它很容易被遗忘,可能在不再有用的很长一段时间里仍然留在缓存中。
  • 考虑使用WeakHashMap代表缓存。【缓存项的生命周期是由该键的外部引用而不是由值决定时】
  • LinkedHashMap类利用它的removeEldestEntry方法可以很容易地实现在给缓存添加新条目的时候顺便清理

3. 监听器和其他回调

  • 如果你实现了一个API,客户端在这个API中注册回调,却没有显式地取消注册,那么除非你采取某些动作,否则它们就会积聚。
  • 最佳方法是只保存它们的弱引用(weak reference),例如,只将它们保存成WeakHashMap中的键。

总结

由于内存泄漏通常不会表现成明显的失败,所以它们可以在一个系统中存在很多年。往往只有通过仔细检查代码,或者借助于Heap剖析工具(Heap Profiler)才能发现内存泄漏问题。因此,如果能够在内存泄漏之前就知道如何预测此类问题,并阻止它们发生,那是最好不过的了。

你可能感兴趣的:(《Effective Java 中文版 第二版》第二章 第6条:消除过期的对象引用)