posts - 10,comments - 4,trackbacks - 0
          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Eliminate obsolete object references消除過期的對象引用
          When you switch from a language with manual memory management, such as C or C++, to agarbage-collected language, your job as a programmer is made much easier by the fact that your objects are automatically reclaimed when you're through with them. It seems almost like magic when you first experience it. It can easily lead to the impression that you don't have to think about memory management, but this isn't quite true.
          java中也要注意內(nèi)存管理

          // Can you spot the "memory leak"?
          public class Stack {
          private Object[] elements;
          private int size = 0;
          public Stack(int initialCapacity) {
          this.elements = new Object[initialCapacity];
          }
          Effective Java: Programming Language Guide
          17
          public void push(Object e) {
          ensureCapacity();
          elements[size++] = e;
          }
          public Object pop() {
          if (size == 0)
          throw new EmptyStackException();
          return elements[--size];
          }
          /**
          * Ensure space for at least one more element, roughly
          * doubling the capacity each time the array needs to grow.
          */
          private void ensureCapacity() {
          if (elements.length == size) {
          Object[] oldElements = elements;
          elements = new Object[2 * elements.length + 1];
          System.arraycopy(oldElements, 0, elements, 0, size);
          }
          }
          }

          這里有一個內(nèi)存泄漏
          如果一個棧先是增長,然后再收縮,那么,從棧中彈出來的對象將不會被當(dāng)做垃圾回收,即使使用棧的客戶程序不再引用這些對象,它們也不會被回收。這是因?yàn)椋瑮?nèi)部維護(hù)著對這些對象的過期引用(obsolete re f e re n c e)。所謂過期引用,是指永遠(yuǎn)也不會再被解除的引用

          改正
          public Object pop() {
          if (size==0)
          throw new EmptyStackException();
          Object result = elements[--size];
          elements[size] = null; // Eliminate obsolete reference清除引用
          return result;
          }

          當(dāng)程序員第一次被類似這樣的問題困擾的時候,他們往往會過分小心:對于每一個對象引用,一旦程序不再用到它,就把它清空。這樣做既沒必要,也不是我們所期望的,因?yàn)檫@樣做會把程序代碼弄得很亂,并且可以想像還會降低程序的性能。“清空對象引用”這樣的操作應(yīng)該是一種例外,而不是一種規(guī)范行為。消除過期引用最好的方法是重用一個本來已經(jīng)包含對象引用的變量,或者讓這個變量結(jié)束其生命周期。如果你是在最緊湊的作用域范圍內(nèi)定義每一個變量(見第2 9條),則這種情形就會自然而然地發(fā)生。應(yīng)該注意到,在目前的J V M實(shí)現(xiàn)平臺上,僅僅退出定義變量的代碼塊是不夠的,要想使引用消失,必須退出包含該變量的方法。

          一般而言,只要一個類自己管理它的內(nèi)存,程序員就應(yīng)該警惕內(nèi)存泄漏問題。一旦一個元素被釋放掉,則該元素中包含的任何對象引用應(yīng)該要被清空。

          內(nèi)存泄漏的另一個常見來源是緩存。一旦你把一個對象引用放到一個緩存中,它就很容易被遺忘掉,從而使得它不再有用之后很長一段時間內(nèi)仍然留在緩存中
          posted on 2006-03-31 16:35 dodoma 閱讀(211) 評論(0)  編輯  收藏 所屬分類: java基礎(chǔ)
          主站蜘蛛池模板: 迁安市| 涪陵区| 出国| 襄城县| 嘉峪关市| 和龙市| 凤台县| 文登市| 抚州市| 靖远县| 湄潭县| 苗栗县| 乌拉特后旗| 九台市| 安溪县| 峡江县| 漳浦县| 怀仁县| 尉犁县| 隆化县| 苏尼特右旗| 平塘县| 正安县| 崇左市| 新津县| 调兵山市| 诏安县| 保亭| 台东县| 宁波市| 克东县| 仲巴县| 泰兴市| 莱西市| 新河县| 远安县| 温宿县| 清丰县| 湛江市| 百色市| 临沧市|