隨筆-199  評(píng)論-203  文章-11  trackbacks-0

                  Java程序中也可能會(huì)發(fā)生內(nèi)存泄露的問(wèn)題,但是Java中引入了垃圾回收機(jī)制。這里所說(shuō)的垃圾就是那些泄露的內(nèi)存。
          在Java語(yǔ)言中,沒(méi)有引用句柄指向的類(lèi)對(duì)象最容易成為垃圾。產(chǎn)生垃圾的情況有很多,主要有以下3種:
          (1)       超出對(duì)象的引用句柄的作用域時(shí),這個(gè)引用句柄引用的對(duì)象就變成垃圾。
          例:

                 Person p1 = new Person();
                 ……

          引用句柄p1的作用域是從定義到“}”處,執(zhí)行完這對(duì)大括號(hào)中的所有代碼后,產(chǎn)生的Person對(duì)象就會(huì)變成垃圾,因?yàn)橐眠@個(gè)對(duì)象的句柄p1已超過(guò)其作用域,p1已經(jīng)無(wú)效,Person對(duì)象不再被任何句柄引用了。      
          (2)       沒(méi)有超出對(duì)象的引用句柄的作用域時(shí),給這個(gè)引用句柄賦值為空時(shí),這個(gè)引用句柄引用的對(duì)象就變成垃圾。
          例:

                 Person p1 = new Person(); 
                 …..
                 p1 = null;
                 ….

          在執(zhí)行完“p1=null;”后,即使句柄p1還沒(méi)有超出其作用域,仍然有效,但它已被賦值為空,不再指向任何對(duì)象,則這個(gè)Person對(duì)象不再被任何句柄引用,變成了垃圾。此后p1還可以指向其它Person對(duì)象,因?yàn)檫€沒(méi)有超出它的作用域。
          (3)       創(chuàng)建匿名對(duì)象時(shí),匿名對(duì)象用完以后即成垃圾。
          例:

          new Person();               //因?yàn)槭悄涿麑?duì)象,沒(méi)有引用句柄指向它,即為垃圾
          new Person().print();
          //當(dāng)運(yùn)行完匿名對(duì)象的print()方法,這個(gè)對(duì)象也變成了垃圾
          ……

                 因此,在程序中應(yīng)盡量少用匿名對(duì)象。
          5.  Java中的對(duì)象銷(xiāo)毀
                 Java語(yǔ)言沒(méi)有提供析構(gòu)函數(shù),要解決內(nèi)存泄露的問(wèn)題,要銷(xiāo)毀不再被引用的對(duì)象,就要借助其它方法,因此Java提供了一種非常好的機(jī)制:垃圾回收機(jī)制,即Garbage Collector,簡(jiǎn)稱(chēng)GC。
                 在Java中,不再被引用的對(duì)象所占據(jù)的內(nèi)存由一個(gè)低優(yōu)先級(jí)的垃圾回收線程自動(dòng)回收。這個(gè)線程是在我們程序的執(zhí)行過(guò)程中在后臺(tái)持續(xù)運(yùn)行的。在Java程序運(yùn)行過(guò)程中,一個(gè)垃圾回收器會(huì)不定時(shí)地被喚起檢查是否有不再被使用的對(duì)象,并釋放它們占用的內(nèi)存空間。垃圾回收器的回收無(wú)規(guī)律可循,可能在程序的運(yùn)行的過(guò)程中,一次也沒(méi)有啟動(dòng),也可能啟動(dòng)很多次。因此,并不會(huì)因?yàn)槌绦虼a一產(chǎn)生垃圾,垃圾回收器就馬上被喚起而自動(dòng)回收垃圾,很可能到程序結(jié)束時(shí)垃圾回收器都沒(méi)有啟動(dòng)。所以垃圾回收器并不能完全避免內(nèi)存泄漏的問(wèn)題。
              正因?yàn)槔厥掌鲉?dòng)的無(wú)規(guī)律性,Java又提供了一種強(qiáng)制啟動(dòng)垃圾回收器的方法:System.gc()方法。在程序中顯式地加入這個(gè)語(yǔ)句,就會(huì)強(qiáng)制啟動(dòng)垃圾回收器。垃圾回收器啟動(dòng)后,就會(huì)等待時(shí)機(jī)釋放不再被引用的對(duì)象所占據(jù)的內(nèi)存空間。但并不是一啟動(dòng)垃圾回收器,它就馬上回收垃圾,如果這時(shí)有高優(yōu)先級(jí)的線程仍在運(yùn)行,回收垃圾的線程需要等待這個(gè)高優(yōu)先級(jí)的線程執(zhí)行完畢以后才可執(zhí)行。
              另一方面,垃圾回收會(huì)給系統(tǒng)資源帶來(lái)額外的負(fù)擔(dān)和時(shí)空開(kāi)銷(xiāo)。它被啟動(dòng)的幾率越小,帶來(lái)的負(fù)擔(dān)的幾率就越小。因此,不提倡在程序代碼中加入大量的System.gc()語(yǔ)句。
              正因?yàn)槔厥掌鞯淖詣?dòng)回收功能,保證了Java開(kāi)發(fā)的程序在長(zhǎng)期運(yùn)行期間產(chǎn)生比較少的內(nèi)存泄露,提高了系統(tǒng)的性能,方便了用戶的使用。
           
          結(jié)束語(yǔ)
                 在C++中,可能因?yàn)椴磺‘?dāng)?shù)厥褂胣ew和delete語(yǔ)句,而導(dǎo)致不能銷(xiāo)毀某些對(duì)象,造成內(nèi)存泄露,從而影響系統(tǒng)的性能;而Java提供了垃圾回收機(jī)制自動(dòng)回收垃圾,銷(xiāo)毀不再使用的對(duì)象,使得內(nèi)存泄露的可能性變得很小。

          posted on 2010-07-06 16:27 Werther 閱讀(1274) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 白玉县| 沅陵县| 墨脱县| 福安市| 莆田市| 深州市| 永州市| 靖远县| 卢氏县| 特克斯县| 南汇区| 子洲县| 彰化市| 正镶白旗| 海林市| 辽宁省| 莱阳市| 容城县| 和田市| 衡阳市| 额尔古纳市| 洪泽县| 望都县| 洛浦县| 大余县| 堆龙德庆县| 济宁市| 元江| 廉江市| 怀柔区| 蕲春县| 格尔木市| 政和县| 长寿区| 外汇| 牡丹江市| 周宁县| 石城县| 宝应县| 新泰市| 许昌市|