《Effective Java》第6条:消除过期的对象引用

     Java通常是通过垃圾回收功能管理内存的,但是还是会有一些情况会造成内存泄露

 一:当类自己管理内存时,应仔细内存泄露问题

     当类自己管理内存时,例如stack类时,pop的元素需要及时的清空引用.其实在数据结构的练习中,stack抛出OutOfMemoryError也是一个比较常见的问题,解决方法就是将元素赋值为null,用来清空对象引用

     当然在Java中清空对象引用应该是一种例外,而不应该时一种规范行为,过分的清空引用会让代码变得杂乱,这种情况也是应该避免的.

二:缓存

     当把对象的引用放到缓存中,就很容易将引用遗忘.

     书中给了几种解决方法(我还没有理解)

    1.只要在缓存之外存在对某个项的键的引用,该项就有意义,那么就可以用WeakHashMap代表缓存;当缓存中的项过期后,它们会被自动删除.

       根据WeakHashMap的特性而言,当键不在被使用时,将会移除键从而移除整个键值对,所以缓存项的生命周期应该有该键的外部引用决定的.

    2. 当难以判断缓存项的生命周期是否有意义时,缓存应该时不时的清除没用的项,我的理解中应该可以模仿垃圾回收机制,建一个守护线程来达到这么一个效果.

三:监听器与其他回调

     当客户端在API中注册回调,却没有显示的取消注册,这种情况下,就会积聚.

     确保回调立即被当做垃圾回收的最佳方法时只保存它们的弱引用.

猜你喜欢

转载自blog.csdn.net/qq_34332035/article/details/81775777