跟我学(Effective Java 2)第6条:消除过期的对象引用

本文探讨了内存泄露的三种来源:无意识对象保持、缓存泄露和监听器及回调,并提供了相应的解决方案。对于无意识对象保持,建议有意识地清除对象引用;对于缓存泄露,推荐使用WeakHashMap;对于监听器和回调,应保存其弱引用以防止积聚。避免内存泄露需要仔细检查代码或使用Heap剖析工具。
摘要由CSDN通过智能技术生成

第6条:消除过期的对象引用

入栈再弹栈,弹出的对象 即使没有被引用,也不会被回收,因为栈内部会维护这些对象的过期引用(obsolete reference)。

什么是过期引用呢?过期引用是指永远也不会被解除的引用,所有栈内活动部分之外的引用都是过期的,即被弹出后就是过期的。

内存泄露的第一种来源: 无意识对象保持。

在这里样例用手动清空的方式解决此问题,所以要进行有意识的清除此类对象。清空对象引用实则是一种例外,而不是常规使用,只有特殊情况下才使用。

优选让包含该引用的变量结束其生命周期。所以只要类是自己管理内存,程序员就应该警惕内存泄漏问题。一旦元素被释放掉,该元素中包含的任何对象引用都应该被清空。

/**
 * 消除过期的对象引用
 */
public class Stack {
    private Object[] elements;//如果该成员是final类型 则clone时会报错
    private int size = 0;
    private static final int DEFAULT_INITIAL = 16;

    public Stack(){
        elements = new Object[DEFAULT_INITIAL];
    }
    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }
    //弹栈的时候 出来的对象 及时没有被引用 也不会被垃圾回收 ,因为 栈内部会对这

些对象维护的过期引用存在内存泄露问题。
    //2 处理方法 清空被弹出的对象
    // 但是 方法依然不是最好的处理方法,最好的方法是调用该引用的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值