Effective Java -- 消除过期的对象引用

Posted 十木禾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective Java -- 消除过期的对象引用相关的知识,希望对你有一定的参考价值。

本文是 《Effective Java Second Edition》第6条的读书笔记,文中如有错误或表述不当,非常欢迎能批评指正,本人不胜感激!


我们来用一段通俗易懂的话来描述什么是过期的对象引用
在我们的程序中,有一些对象我们程序员已经非常明确的知道其不会再被使用,由于还存在被引用(我们知道如果执行了这种引用就是非法操作),所以不会被GC(内存泄露),所以这种引用的额存在已经没有任何的价值,故我们将这种引用行为称之为 过期的对象引用

在我们数据结构之中,堆栈和队列的实现就是一个可能会存在过期的对象引用的例子。
看如下队列实现的代码

package com.blog.effective6;

/**
 * 存在过期对象引用的队列.
 *
 * @author 张俊强~.
 * @date 2017/11/12-8:48.
 */
@SuppressWarnings("unchecked")
public class MyQueue<T> 

    private T[] elements;   //保存数据的对象数组
    private int size = 0;   //当前队列的大小
    private int cur = 0;    //标识下一个pop出来的对象的位置
    private static final int MyQueueSize = 20;//队列的最大大小

    public MyQueue() 
        elements = (T[]) new Object[MyQueueSize];
    

    public void push(T t) 
        if (size < MyQueueSize) 
            elements[size++] = t;
         else 
            throw new RuntimeException("当前队列已满");
        
    

    public T pop() 
        if (cur < size) 
            return elements[cur++];
        
        throw new RuntimeException("当前队列为空");
    

如果我们首先push()五个元素,再pop()两个元素出来。
这时候我们的cur指向的就是第三个元素的位置
前两个元素由于被pop()出去,所以我们知道其不会再被使用,然后它仍然在内存中存在。那么对这个存在的对象的应用就是过期的了!

如下图示

那么在这个例子中,我们要怎样来消除这一引用呢?

如下,我们在pop()的时候,将对应的要pop()的数组元素的对象引用指向null就可以了。

    public T pop() 
        if (cur < size) 
            T t= elements[cur];
            elements[cur]=null;     //指向 null
            cur++;
            return t;
        
        throw new RuntimeException("当前队列为空");
    

过期的对象引用势必会引起内存泄露,有关内存泄露的更多内容下次再写!


以上 2017/11/12 09:49 于上海

以上是关于Effective Java -- 消除过期的对象引用的主要内容,如果未能解决你的问题,请参考以下文章

Effective Java 之-----消除过期的对象引用

Effective Java -- 消除过期的对象引用

《Effective Java 中文版 第2版》学习笔记 第6条:消除过期的对象引用

Effective Java目录

Effective Java--读书笔记

Effective Java总结的78条