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 之-----消除过期的对象引用