熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

消除對過期對象的引用

2013-11-23 18:38:43  來源: Java核心技術 

  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等)
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25514.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.