现在的位置: 首页 > 综合 > 正文

第6条:消除过期的对象引用

2014年02月16日 ⁄ 综合 ⁄ 共 1125字 ⁄ 字号 评论关闭

下面这段程序存在一个“内存泄漏”。在极端的情况下,会导致磁盘交换(Disk Paging),甚至导致程序失败(OutOfMemoryError)。
那么哪里引起的内存泄漏呢?
如果一个栈先是增长,然后再收缩,那么从栈中弹出来的对象讲不会被当做垃圾回收,即使使用的栈程序不再引用这些对象。
这是因为,栈内部维护着对这些对象的过期引用(obsolete reference)。过期引用是指,永远也不会再被接触的引用。
demo:

  1. //
    Can you spot the "memory leak"?
      
  2.   
  3. import java.util.*;  
  4.   
  5. public class Stack
    {  
  6.     private Object[]
    elements;  
  7.     private int size
    0;  
  8.     private static final int DEFAULT_INITIAL_CAPACITY
    16;  
  9.   
  10.     public Stack()
    {  
  11.         elements
    new Object[DEFAULT_INITIAL_CAPACITY];  
  12.     }  
  13.   
  14.     public void push(Object
    e) {  
  15.         ensureCapacity();  
  16.         elements[size++]
    = e;  
  17.     }  
  18.   
  19.     public Object
    pop() {  
  20.         if (size
    == 
    0)  
  21.             throw new EmptyStackException();  
  22.         return elements[--size];  
  23.     }  
  24.   
  25.     /** 
  26.     
    * Ensure space for at least one more element, roughly
     
  27.     
    * doubling the capacity each time the array needs to grow.
     
  28.     
    */
      
  29.     private void ensureCapacity()
    {  
  30.         if (elements.length
    == size)  
  31.             elements
    = Arrays.copyOf(elements, 2 *
    size + 
    1);  
  32.     }  
  33. }  

修复的方法:
一旦对象引用已经过期,只需清空这些引用即可。
   

  1. public Object
    pop() {  
  2.     if (size
    == 
    0)  
  3.         throw 

抱歉!评论已关闭.