JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Software Design » Effective Java  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [Effective Java] 條款5 : 消除老舊的(逾期的) object references
metavige

metavige

版主

發文: 2133
積分: 10
於 2003-10-03 14:48 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
因為 Java 有所謂的 garbage-collected 機制
所以就不會像是 C/C++ 這樣的語言
需要自己手動作記憶體控管

但是這有存在一些漏洞

以下的 Code 是參考 [Effective Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 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];
  }
 
  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 aleast one more element, roughly
   * doubling the capacity each time the array 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, size);
    }
  }
}


這個程式有可能會發生記憶體洩漏的問題
如果這個 stack 成長後縮小
則那些被 popped off 的那些物件則不會被回收
因為 stack 仍舊維護著那些指向「不在使用的物件」的老舊 reference
修正這個問題的作法 - 一旦 reference 已經逾期, 就把他設為 null
通知 JVM 將資源回收


消除逾期 reference 的最佳方法
是復用那些變數, 或者是讓他調離作用域 (scope) - 參考條款 29
在目前的 JVM 裡面, 必須離開其所在的函式, 才能讓 reference 徹底消失

另一個記憶體洩漏的常見原因
就是 Cache 機制

解法1:實作 WeakHashMap
「只要 cache 以外存在有任何 reference 指涉 cache 的某筆條款(entry)的鍵值(key), 該筆條目就是有意義的」
我想大概是說
如果在 cache 裡面的 entry 物件有在其他地方被使用
那就表示這個 reference 還有效

解法2:由背景執行緒進行

-----------------------------------------------------------------------------------


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
話題樹型展開
人氣 標題 作者 字數 發文時間
5981 [Effective Java] 條款5 : 消除老舊的(逾期的) object references metavige 1664 2003-10-03 14:48
» JWorld@TW »  Software Design » Effective Java

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8