public Object pop(){
if(size==0) throw new EmptyStackException();
return element[--size]; //短暂造成内存泄露
}
上面的代码每一次pop()的时候,Stack都会弹出一个元素,在没有加入新元素之前,实际上仍然有一个引用element[x]指向了这个已经弹出的对象,因此GC是不会对其进行垃圾回收的。只有push()新元素的时候使得element[x]=newObject,才会使得以前创建的对象有可能被回收。应该把上面的pop()方法改成下面的代码就安全多了:
public Object pop(){
if(element.length==size) throws EmptyStackException();
Object o=element[--size];
elements[size]=null; //使得GC有机会回收这个对象
return o;
}
B.getInstance().setA(this);
private static B instance=new B();
public static B getInstance(){
显然B采用singleton模式,他持有一个A对象的引用,而这个A类的对象将不能被回收。想象下如果A是个比较大的对象或者集合类型会发生什么情况。
Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{Object o = new Object();
v.add(o);
o = null;
}