美文网首页《Effective Java 中文版 第二版》
《Effective Java 中文版 第二版》第二章 第6条:

《Effective Java 中文版 第二版》第二章 第6条:

作者: 不平凡的小黄宁 | 来源:发表于2017-12-01 23:30 被阅读0次

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


    [toc]

    内存泄漏问题

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

    问题出现 及 解决方式

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

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

    2. 缓存

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

    3. 监听器和其他回调

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

    总结

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

    相关文章

      网友评论

        本文标题:《Effective Java 中文版 第二版》第二章 第6条:

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