美文网首页
第六条消除过期的对象引用

第六条消除过期的对象引用

作者: 没走过的二丁目 | 来源:发表于2018-03-08 14:39 被阅读0次

考虑下面的例子(栈的实现)

public class Stack {
    private Object[] elements;
    private int top;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    public Stack(){
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    public void push(Object object){
        ensureCapacity();
        elements[top++] = object;

    }
    public Object pop(){
        if(top == 0){
            throw new EmptyStackException();
        }
        return elements[--top];
    }
    private void ensureCapacity(){
        if(elements.length == top){
            elements = Arrays.copyOf(elements,2* top +1);
        }
    }
}

这段程序中没有明显的错误,但是隐藏着一个问题 ,即 “内存泄漏” 当一个元素被出栈以后就变成过期的,不会被当做垃圾来回收,这是因为栈内部维护着对这些对象的过期引用,那么如何解决呢?看代码

 public Object pop() {
        if (top == 0) {
            throw new EmptyStackException();
        }
        Object result = elements[--top];
        elements[top] = null;
        return result;
    }

当程序员第一次被这样的问题困扰时,他们往往会过分小心,对于每一个对象一旦不会再用到了就将他置为空,其实完全没有必要

清空对象引用应该是一种例外,不是一种规范行为

那么什么时候应该清空引用呢? 答案是只要类是程序员自己管理内存,就应该警惕内存泄漏的问题,一旦元素被释放掉,则该元素中 包含的任何对象的引用都应该被清空。

内存泄漏的另一个常见来源是缓存。

一段把对象引用放到缓存中就,他就很容易被遗忘掉,从而使得他不再有用后很长一段时间内任然留在缓存中。如果你将要实现这样一种缓存:只要在缓存之外存在对某个项键的作用,该项就又意义(缓存项的生命周期是由外部引用决定,而不是由值决定时),此时就可以使用weakHashMap

相关文章

  • 第六条消除过期的对象引用

    考虑下面的例子(栈的实现) 这段程序中没有明显的错误,但是隐藏着一个问题 ,即 “内存泄漏” 当一个元素被出...

  • 消除过期的对象引用

    第6条:消除过期的对象引用 1. 为什么要消除过期的对象引用 java虽然有自己的垃圾回收机制,但是并没有那么的智...

  • 消除过期的对象引用

    你能看出以下代码哪里内存泄漏吗? 答案是: pop()方法存在内存泄漏。 内存泄漏可以称为“ 无意识的对象保持(u...

  • 消除过期的对象引用

    什么是过期的对象引用? 我们通过简单的栈实现来引入过期的对象引用。 实际上,这段程序中并没有很明显的错误。无论如何...

  • 消除过期的对象引用

    某些类内部维护着对象的过期引用(指永远也不会再被解除的引用),这些对象不会被当作垃圾回收,产生了内存泄露(这类内存...

  • 消除过期的引用对象

    C或者C++是手工管理内存语言,java语言是自带垃圾回收,程序员的工作就很容易,因为当你用完了对象之后,他会被自...

  • 高效Java第六条消除过期的对象引用

    问题的引出 这段程序有一个“内存泄露”,随着GC活动的增加,或者由于内存占用的不断增加,程序性能降低会逐渐表现出来...

  • 消除过期的对象的引用

    一、消除过期的对象的引用的好处 好处1、防止内存泄漏,导致磁盘交换,甚至会导致程序失败好处2、如果错误地解除引用,...

  • 1.7消除过期的对象引用

    1.7消除过期的对象引用 1.7.1 ​ 以下代码并没有明显的错误,无论如何测试,它都会成功通过每一项测...

  • Effective Java 第二章

    避免创建不必要的对象 优先考虑使用基本类型而不是装箱类型,要当心无意识的自动装箱 消除过期对象的引用 一旦对象引用...

网友评论

      本文标题:第六条消除过期的对象引用

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