当你从手工管理内存的语言到具有垃圾回收机制的功能语言的时候,你也许会觉得很神奇,甚至有点不可思议,然而,却不知这种不可思议的背后却潜在着危机。所以在编写Java程序的时候,一定也是必要的要考虑一下“消除过期的对象引用”。我们来看这样一个列子:
public class Stack {
private Object[] elements;
private int size = 0;
private int DEFAULT_SIZE = 10;
public Stack() {
elements = new Object[DEFAULT_SIZE];
}
public void push(Object e) {
elements[size++] = e
}
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
return elements[--size];
}
}
以上是一个简单的实现栈的一段程序,也许你会觉得没有什么问题,可是问题恰恰就潜在在你的代码中,不严格的讲, 程序中有一个”内存泄漏“,随着垃圾回收器活动的增加,程序的性能会不断降低。那么这段程序究竟是哪里出了问题呢?其实就在pop()方法中,当每次取出一个元素放回后,其实elements还维护着这些取出的元素(虽然这些对象对于栈来说已经没有存在的必要),而对于这些过期的对象是永远不会被解除的,所以导致内存一直得不到释放。解决这个问题的方法很简单,就是在pop()方法的中做如下修改
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
Object result = elememts[--size];
element[size] = null;
return result;
}
所以清空过期对象应该引起程序员的重视,但是对于清空过期对象应该是一种意外,而不是一种规范的要求。