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

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

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

    隨筆-199  評論-203  文章-11  trackbacks-0
    內(nèi)存是稀缺的資源,哪怕內(nèi)存一塊錢一條!如果在編程中使用不當,再大的內(nèi)存也會耗光。

        一、認識Java的自動垃圾回收

        垃圾回收是Java語言的一大特性,方便了編程,是以消耗性能為代價的。而垃圾在這里只無用的對象。而C++是需要程序員自己寫析構(gòu)函數(shù)來釋放內(nèi)存的,麻煩,也有可能忘記而導(dǎo)致內(nèi)存泄露。

        Java語言對內(nèi)存的分配管理是通過JVM內(nèi)部機制決定的。程序員可以不關(guān)心其處理。

        二、垃圾回收的原理和意義

        Java虛擬機中有個稱之為垃圾回收器的東西,實際上這個東西也許真正不存在,或者是已經(jīng)集成到JVM中了,但這無關(guān)緊要,我們?nèi)匀豢梢苑Q為為垃圾回收器。

        垃圾回收器的作用是查找和回收(清理)無用的對象。以便讓JVM更有效的使用內(nèi)存。

        垃圾回收器的運行時間是不確定的,由JVM決定,在運行時是間歇執(zhí)行的。雖然可以通過System.gc()來強制回收垃圾,但是這個命令下達后無法保證JVM會立即響應(yīng)執(zhí)行,但經(jīng)驗表明,下達命令后,會在短期內(nèi)執(zhí)行你的請求。JVM通常會感到內(nèi)存緊缺時候去執(zhí)行垃圾回收操作。

        垃圾回收過于頻繁會導(dǎo)致性能下降,過于稀疏會導(dǎo)致內(nèi)存緊缺。這個JVM會將其控制到最好,不用程序員擔心。但有些程序在短期會吃掉大量內(nèi)存,而這些恐怖的對象很快使用結(jié)束了,這時候也許有必要強制下達一條垃圾回命令,這是很有必要的,以便有更多可用的物理內(nèi)存。

        從上面了解到,沒有用的對象就是垃圾。準確的說,當沒有任何線程訪問一個對象時,該對象就符合垃圾回收的條件。

        對于String,存在一個字符串池,這個不屬于本文討論的范圍,字符串池中的垃圾回收,算法和這里所討論的垃圾回收完全是兩碼事。但是不得不說的是,字符串的胡亂拼接,往往導(dǎo)致性能急劇下降,尤其是在龐大的循環(huán)語句中,拼接字符串就是在讓程序慢性自殺。這也是很多Java程序員容易犯的毛病。

        字符串既然是池,就是為了緩沖,為了有更高的命中率,因此垃圾回收的頻率也許會比JVM對象垃圾回收器要低很多。

        垃圾回收器僅僅能做的是盡可能保證可用內(nèi)存的使用效率,讓可用內(nèi)存得到高效的管理。程序員可以影響垃圾回收的執(zhí)行,但不能控制。

        三、通過編程影響垃圾回收

        雖然程序員無法控制JVM的垃圾回收機制。但是可以通過編程的手段來影響,影響的方法是,讓對象符合垃圾回收條件。

        分別說來有一下幾種:

        1、將無用對象賦值為null.

        2、重新為引用變量賦值。比如:

     

     Person p = new Person("aaa");
     p = new Person("bbb");

     

        這樣,new Person("aaa")這個對象就是垃圾了——符合垃圾回收條件了。

        3、讓相互聯(lián)系的對象稱為“島”對象

     

     Person p1 = new Person("aaa");
     Person p2 = new Person("bbb");
     Person p3 = new Person("ccc");
     p1=p2; p2=p3; p3=p1;
     p1=null; p2=null; p3=null;

     

        在沒有對p1、p2、p3置null之前,它們之間是一種三角戀關(guān)系。分別置null,三角戀關(guān)系依然存在,但是三個變量不在使用它們了。三個Person對象就組成了一個孤島,最后死在堆上——被垃圾回收掉。

        4、強制的垃圾回收System.gc()

        實際上這里的強制,是程序員的意愿、建議,什么時候執(zhí)行是JVM的垃圾回收器說了算。

        調(diào)用垃圾回收也不一定能保證未使用的對象一定能從內(nèi)存中刪除。

        唯一能保證的是,當你內(nèi)存在極少的情況,垃圾回收器在程序拋出OutofMemaryException之前運行一次。
      四、很神秘的finalize()方法

        finalize()方法的確很神秘,是因為你不了解其原理。

        原理:1、finalize()方法是Object中的方法。

        2、finalize()方法會在對象被垃圾回收之前被垃圾回收器調(diào)用一次,這是Java語言的一種機制。

        3、finalize()方法在任何對象上最多只會被垃圾回收器調(diào)用一次。

        陷阱:1、垃圾回收器無法保證垃圾對象能被回收,因此,finalize()方法也無法保證運行。建議不要重寫finalize()方法,即使重寫,也不要在finalize()方法中寫關(guān)鍵的代碼。

        2、finalize()方法中可以把自己傳遞個別的對象,這樣就不是垃圾了,避免了被回收。但是當下次這個對象又符合垃圾回收的時候,finalize()方法不會被調(diào)用第二次了,而是直接被清理掉了。

        總結(jié):

        理解了垃圾回收的前提是理解Java運行時的內(nèi)存堆棧模型。

        理解Java垃圾回收的目的是為了對Java內(nèi)存管理有個認識,在編程時更有效的使用內(nèi)存。

        不建議為了垃圾回收,手動編寫大量代碼,這是很愚蠢的做法。可以通過簡單的方式去影響即可。

        本文的討論的垃圾回收排除String對象。String的垃圾回收與String池有很很大關(guān)系,目前還沒有研究。但是文中已經(jīng)提及String使用中容易出現(xiàn)的問題。

    posted on 2009-07-05 21:53 Werther 閱讀(2306) 評論(4)  編輯  收藏 所屬分類: 10.Java

    評論:
    # re: Java的垃圾回收總結(jié) 2009-07-05 23:35 | 凡客誠品
    不建議為了垃圾回收,手動編寫大量代碼,這是很愚蠢的做法。可以通過簡單的方式去影響即可  回復(fù)  更多評論
      
    # re: Java的垃圾回收總結(jié) [未登錄] 2009-07-06 09:27 | kimi
    對 gc 的解釋不太全面  回復(fù)  更多評論
      
    # re: Java的垃圾回收總結(jié) 2009-07-10 16:44 | 火星漁者
    除了明知道要產(chǎn)生大量垃圾的情況下用System.gc()回收一下,其余的時候幾乎不用管它。  回復(fù)  更多評論
      
    # re: Java的垃圾回收總結(jié) 2010-03-23 11:26 | HoldBelief
    我覺得你的三角戀關(guān)系是錯誤的, p1=p2; p2=p3; p3=p1; 之后根本沒有形成三角戀關(guān)系,
    因為此時 p1 = p3 = new Person("bbb");
    p2 = new Person("ccc");
    這里根本沒有 new Person("aaa")的事情, 你自己運行一遍這個例子就知道了,
    當p1=p2; p2=p3; p3=p1; 這句代碼結(jié)束后, new Person("aaa")就已經(jīng)被GC回收了  回復(fù)  更多評論
      
    主站蜘蛛池模板: 中文字幕在线观看免费视频| h视频免费高清在线观看| 国产羞羞的视频在线观看免费| 亚洲熟伦熟女新五十路熟妇 | 国产精品高清免费网站| 亚洲国产日韩在线观频| 国产精品视频全国免费观看| 浮力影院亚洲国产第一页| 久久久精品国产亚洲成人满18免费网站| 国产成人亚洲综合无码| 最好免费观看高清在线| 亚洲色偷偷av男人的天堂| 麻豆一区二区免费播放网站 | 视频一区在线免费观看| 亚洲国产精品无码久久久久久曰 | 激情婷婷成人亚洲综合| 亚洲第一区精品观看| 国产一级a毛一级a看免费视频 | 97av免费视频| 亚洲国产日韩综合久久精品| 国产成人精品免费视频软件| 一级毛片免费不卡直观看| 情人伊人久久综合亚洲| 在线看无码的免费网站| 亚洲变态另类一区二区三区| 亚洲无码日韩精品第一页| 久久久久久成人毛片免费看 | 亚洲制服丝袜第一页| 国产成人无码a区在线观看视频免费| 成人精品综合免费视频| 久久夜色精品国产嚕嚕亚洲av| 国产日本一线在线观看免费 | 久操免费在线观看| 99999久久久久久亚洲| 亚洲精品网站在线观看不卡无广告| 久久精品电影免费动漫| 亚洲AV一区二区三区四区| 亚洲精品乱码久久久久久久久久久久| 人与禽交免费网站视频| 一级免费黄色大片| 久久亚洲最大成人网4438|