电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

消除对过期对象的引用


发布日期:2018/1/23
 

Java比c++方便的一点就是java有自己的垃圾收集机制可以自动帮你收集垃圾但是这并非意味着使用java我们就不需要考虑内存管理了

这一点相信很多java程序员都是知道的就是当一个对象我们决定不再使用的时候最好可以手动设置它为null特别是这个object比较耗费资源的时候

Effective java上的例子

import javautil*;

// Can you spot the memory leak?

public class Stack {

private Object[] elements;

private int size = ;

public Stack(int initialCapacity) {

thiselements = new Object[initialCapacity];

}

public void push(Object e) {

ensureCapacity();

elements[size++] = e;

}

public Object pop() {

if (size==)

throw new EmptyStackException();

Object result = elements[size];

elements[size] = null; // Eliminate obsolete reference

return result;

}

/**

* Ensure space for at least one more element roughly

* doubling the capacity each time the array needs to grow

*/

private void ensureCapacity() {

if (elementslength == size) {

Object[] oldElements = elements;

elements = new Object[ * elementslength + ];

Systemarraycopy(oldElements elements size);

}

}

public static void main(String[] args) {

Stack s = new Stack();

for (int i=; i<argslength; i++)

spush(args[i]);

for (int i=; i<argslength; i++)

Systemoutprintln(spop());

}

}

这是一个简单的实现堆栈数据结构的程序

这个程序的编译和测试是没有问题的它的问题存在哪里呢?

在这个程序里如果这个堆栈先push然后再pop的话那么弹出来的对象不会被释放因为栈内部维护着对这个对象永远都不会解除的引用

我们每次弹出一个对象都要令element[size]=null;

总结在拥有自动垃圾收集功能的语言里我们要特别注意内存管理的问题因为这个时候内存的溢出问题不会象c plus plus这些那么明显我们要防范于未然另外根据的经验inputstreamreader等文件读写类我们要在set 他们为null的之前close他们的连接即调用inclose()然后再in=null;(这里in是一个inputstreamreader等)

上一篇:分析和设计

下一篇:jxl 实用技巧(2)