<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    posts - 10,comments - 4,trackbacks - 0
    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中也要注意內存管理

    // 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);
    }
    }
    }

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

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

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

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

    內存泄漏的另一個常見來源是緩存。一旦你把一個對象引用放到一個緩存中,它就很容易被遺忘掉,從而使得它不再有用之后很長一段時間內仍然留在緩存中
    posted on 2006-03-31 16:35 dodoma 閱讀(208) 評論(0)  編輯  收藏 所屬分類: java基礎
    主站蜘蛛池模板: 狼友av永久网站免费观看| 久草视频免费在线观看| 亚洲第一网站男人都懂| 亚洲日韩国产一区二区三区在线| 18禁黄网站禁片免费观看不卡| 亚洲国产美国国产综合一区二区| 国产高清免费观看| 亚洲日本久久久午夜精品| 两性刺激生活片免费视频| 亚洲男女性高爱潮网站| 4hu四虎最新免费地址| 亚洲人成网站在线观看播放青青| 最近中文字幕完整免费视频ww| 亚洲欧洲春色校园另类小说| 国产成人免费午夜在线观看 | 国产一区二区免费在线| 免费一级全黄少妇性色生活片 | 国产成人亚洲综合无码精品| 天堂在线免费观看| 亚洲av永久无码精品网站| 日韩av无码久久精品免费| 国产精品亚洲精品| 免费夜色污私人影院在线观看| 无码AV动漫精品一区二区免费| 久久影视综合亚洲| 24小时在线免费视频| 亚洲AV永久无码精品一福利| 亚洲国产精品自产在线播放| 很黄很污的网站免费| 亚洲AV无码乱码在线观看代蜜桃 | 亚洲性无码AV中文字幕| 国产免费牲交视频| 99久久成人国产精品免费| 亚洲网红精品大秀在线观看| 天天拍拍天天爽免费视频| 在线播放国产不卡免费视频| 久久精品国产亚洲av高清漫画 | 国产啪精品视频网站免费尤物| 亚洲精品无码久久久久久久 | 国产一二三四区乱码免费| 亚洲精品高清国产麻豆专区|