第六条 消除过期引用
JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象。这是因为栈的内部维护着对这些对象的过期引用(永远也不会被解除的引用),需要显示的将这些对象清空(置为null),告诉垃圾回收器回收这些对象。
比如Stack类的实现里,pop()函数最后会有对element置null的操作:
public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); return obj; } public synchronized void removeElementAt(int index) { ........... ........... elementData[elementCount] = null; /* to let gc do its work */ }
除了栈上的内存泄露以外,还有缓存上的内存泄露,即把对象放缓存然后忘记;还有监听器和其他回调时,这个貌似不太严重。。。。
时间: 2024-11-04 19:55:56