《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > Java程序中提高垃圾收集效率的方法

Java程序中提高垃圾收集效率的方法

2009-09-01
作者:吳良巧

  摘? 要: 針對復雜的對象引用關系影響垃圾收集效率的問題,分析了對象之間存在的引用關系,提出了簡化對象引用關系的解決方法。

  關鍵詞: 垃圾收集? 對象引用? Java語言

?

  垃圾收集(Garbage Collection)是Java程序員在程序開發中感到最方便的一個特性,它使程序員擺脫了內存管理的困擾。盡管JVM的垃圾收集器已經在結構和算法上作了相當大的改進,但在實際應用中,尤其在大型的應用軟件中,還是會碰到一些實際問題。一個比較普遍的問題是,一些已經沒用的對象所占的內存難以釋放。在操作過程中,內存持續階梯式上升,經常在某個時候出現明顯的停頓,并感覺這次操作特別慢,這是由于發生了一次完全的垃圾收集的結果。導致垃圾收集效率下降、甚至發生內存泄漏的原因是多方面的。由于存在不恰當的對象引用以及復雜的對象引用關系是發生這個問題的重要因素,同樣處理好對象引用關系也是解決這個問題的關鍵。

1? 對象引用分析

  在Java程序中,被靜態(Static)變量和全局(Global)變量直接或間接引用的對象不能被垃圾收集器收集。假如一個對象被一個靜態變量引用,即使該對象已經沒有用處了,也不能作為垃圾被收集。不僅如此,該對象直接和間接引用的所有對象都不能被收集。

  除了上述情況,理論上不可被靜態變量和全局變量直接或間接引用其他所有對象,即使它們之間存在著相互引用關系,也可以被垃圾收集器收集。但是,不管垃圾收集器如何工作、對象是否被靜態變量和全局變量直接或間接引用,對象引用關系越復雜,處理時花費的時間就越多。因此,由于垃圾收集器結構和算法上的局限,對于一些引用關系復雜的對象,需要經過多次或完全的垃圾收集才可以收集。這將導致垃圾收集器消耗額外的資源,影響垃圾收集的效率。對于引用關系特別復雜的對象,垃圾收集器可能根本沒有足夠的時間來處理,從而容易造成內存的泄漏。

  為了說明對象的引用關系,下面以對話框及其組件為例說明。TestDialog從JDialog繼承,對話框中放置一個JButton按鈕,按鈕添加了一個動作監聽器(ActionListener)。以下是類的部分代碼:

  

  圖1為對話框和按鈕相關的主要對象的引用關系圖。圖中方框表示對象實例(Instance)的類或類型,其中TestDialog$1為TestDialog的匿名內部類,就是添加到按鈕的ActionListener監聽器對象所對應的類;連接線表示對象引用關系,其中箭頭指向的對象被另一個對象直接引用,連接線旁的文字表示引用了被引用對象的屬性(變量),如TestDialog對象直接引用了JButton對象,JButton對象的引用保存在TestDialog的屬性testButton中;Object數組把對象的引用作為元素存放。

?

  從圖1可以看出:一個對象對另外一個對象的引用可以是直接的,也可以通過其他對象的引用發生間接引用。在TestDialog對象和JRootPane對象的引用關系中,通過屬性rootPane直接引用了JRootPane對象;屬性component引用一個Object數組對象,而JRootPane對象又是Object數組的一個元素,因而TestDialog對象又同時間接地引用了JRootPane對象。

  從圖1中還可以看到一個普遍的現象,即對象之間經常存在著相互引用關系,而且有時候存在多條的引用路徑,如TestDialog對象與JButton對象之間的相互引用。首先TestDialog對象中的testButton屬性直接引用了JButton對象,同時,通過容器和組件的關系,使得JRootPane、JPanel等又存在間接的引用;JButton對象反過來又引用TestDialog對象。即通過屬性parent對容器對象進行引用,對話框是對話框內組件的頂層容器,JButton對象通過容器和組件的關系實現對TestDialog對象的引用。另外,JButton對象通過監聽器列表對TestDialog$1內部類的對象實例進行引用,而匿名內部類對外部類(即TestDialog)的對象實例有缺省的引用。

  單從圖1看,這些對象的引用關系似乎不太復雜,但實際上很多對象本身的引用關系已經非常復雜,尤其是Swing組件。這些組件內部的對象引用比較多。圖2是以JButton為例的對象引用關系圖。為了清晰,圖中只給出了與數據模型(Model)的引用關系。

?

????除了與DefaultButtonModel對象的相互引用外,通過JButton的屬性layoutMgr與OverlayLayout的屬性target,JButton和OverlayLayout的對象也形成相互引用。JButton對象還通過以下引用路徑,最后又引用回到本身對象。其中前面表示為類,括號內是該類或父類中的屬性。

  JButton(ActionMap actionMap)

  -> ActionMap(ActionMap parent)

  -> ActionMapUIResource(AbstractAction$ArrayTable

  arrayTable)

  -> AbstractAction$ArrayTable(Object table)

  -> Object[] ()

  -> BasicButtonListener$PressedAction(AbstractButton b)

  -> JButton;

  JButton與其他對象的引用路徑在這里不一一列舉。

  在這個示例中,一些組件對象已經存在比較復雜的引用關系,通過與另一些對象形成的相互引用,又組成了更加復雜的對象引用關系。在關閉對話框時,如果不作特別的操作,這些對象的引用關系將保持不變,從而對垃圾收集的效率產生很大的影響。

在存在引用關系的所有對象中,假如某個對象仍然有用或者不恰當地被靜態變量和全局變量直接或間接引用,將導致有引用關系的所有應該成為垃圾的對象無法被收集,從而造成一定的內存泄漏。

2?解決方法

  為了提高垃圾收集的效率,必須簡化對象的引用關系,并及時清除靜態變量的引用以避免內存泄漏。具體方法可以通過以下幾個方面來實現。

2.1 清除直接對象引用

  當一個對象不再被使用時,應該及時清除引用該對象的所有靜態變量,同時,清除該對象中類型為對象的屬性。若有必要,則還應該調用該屬性引用的對象的某個方法來清除內存或釋放資源。如在對話框的例子中,當對話框關閉時,應該清除屬性testButton的引用,這時可以簡單地使用賦值語句“testButton=null;”,從而使對象的引用關系變得簡單。

2.2 調用對象的特定方法

  當一個對象不再被使用時,如果對象提供了用來清除引用或釋放資源的方法,則應該調用這些方法,但要注意調用的時機或順序,避免引起異?,F象。這些方法包括對話框的Dispose方法、容器組件的Remove方法、Swing組件UI的Uninstall方法、移除監聽器方法等,也可以是某個類本身定義的清除引用方法。

  在對話框的例子中,對話框的Dispose方法主要釋放一些與本地有關的資源,若不調用,將不能清除對話框的一個全局引用,造成內存泄漏。容器的Remove方法主要清除了容器的變量Componet對數組的引用以及數組對子組件對象的引用,同時也清除了子組件對象中的變量Parent對容器對象的引用。若清除容器中的所有組件,則可簡單地調用RemoveAll方法清除。在JButton中,可以調用SetMode(null)來設置Model。這樣,不僅清除了JButton對象中的Model和ChangeListener對象引用,而且同時清除了DefaultButtonModel對AbstractButton$ButtonChangeListener監聽器對象的間接引用。如果調用了上述的這些方法,則在對話框例子中,許多對象引用被清除,可以極大地簡化各個對象之間的引用關系。

2.3 慎重使用內部類

  非靜態內部類(包含一般的匿名內部類)中,隱含著外部類的對象實例的一個引用,這個引用無法清除。在對話框的例子中,匿名內部類實際包含這樣的一個屬性(變量):

  private final TestDialog this$0;

  這個屬性在內部類中就是源代碼中使用的TestDialog.this。由于該屬性是final修飾,所以不允許再次賦值,不可以清除。同樣,由于沒有使用變量來保存該監聽器對象的引用,因此無法簡單地使用JButton的RemoveActionListener方法移除加在按鈕上的監聽器。為了清除上述的引用關系,可以把匿名內部類改寫為一個靜態內部類,把對話框的實例作為該內部類的構造器的參數顯式地傳入,同時在對話框中保存該內部類的對象引用。在清除引用時,既可以移除監聽器,也可以通過監聽器變量清除內部類的對話框引用。原來的對話框部分代碼可以改為以下代碼,這時應該使用dialog變量,而不是TestDialog.this:

  

3? 結束語

  通過各種方法清除對象的引用,可以簡化相關對象的引用關系,使得應該成為垃圾的對象及時被收集以釋放內存,從而減少程序對操作系統的內存需求。在大型應用軟件“永中Office”的實際應用過程中,在處理對象引用關系復雜的情況時,采用了簡化對象引用關系的方法,使垃圾收集效率得到明顯的提高。

?

參考文獻

1 Bloch J.Java高效編程指南.北京:機械工業出版社,2002

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          国产日韩欧美精品综合| 亚洲影院高清在线| 欧美/亚洲一区| 国产精品久久久一区二区| 精品99视频| 欧美黄色片免费观看| 久久精品72免费观看| 国产一区二区三区在线观看精品| 欧美日本久久| 午夜在线播放视频欧美| 国产日韩精品视频一区二区三区| 欧美激情精品久久久久久蜜臀| 91久久夜色精品国产九色| 欧美成人综合在线| 国产一区二区三区在线免费观看| 久久久久久久综合狠狠综合| 久久久免费观看视频| 国产欧美日韩视频| 亚洲高清久久久| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩在线亚洲一区蜜芽| 欧美日韩国产首页在线观看| 国产麻豆综合| 亚洲免费观看高清在线观看| 中文亚洲欧美| 国产日韩精品一区二区三区在线| 国产精品mv在线观看| 国内精品视频久久| 亚洲大片精品永久免费| 91久久久久久国产精品| 在线观看国产一区二区| 欧美电影免费观看大全| 精品成人一区| 亚洲天堂男人| 欧美bbbxxxxx| 性视频1819p久久| 久久激情网站| 国产精品系列在线播放| 欧美精品久久久久久久| 亚洲国产第一| 欧美福利精品| 中文av一区二区| 亚洲天堂av在线免费观看| 欧美日本在线| 亚洲经典在线| 午夜欧美精品久久久久久久| 免费中文字幕日韩欧美| 欧美日韩中文字幕日韩欧美| 欧美精品一区二区高清在线观看| 亚洲激情在线| 久久国产精品久久久久久| 欧美日韩精品免费在线观看视频| 日韩网站在线| 欧美日韩国产另类不卡| 亚洲精品在线二区| 亚洲欧美日韩一区二区三区在线| 欧美日韩国产黄| 亚洲一区国产精品| 欧美一级播放| 国产亚洲综合在线| 亚洲国产日韩欧美在线动漫| 国产主播在线一区| 午夜精品久久一牛影视| 国产在线一区二区三区四区| 欧美成人性生活| 国产欧美一区二区视频| 欧美精品一区在线观看| 99国产精品久久| 亚洲精品久久久久久久久| 欧美调教vk| 国产精品视频久久| 亚洲一卡二卡三卡四卡五卡| 女人色偷偷aa久久天堂| 巨乳诱惑日韩免费av| 久久婷婷久久一区二区三区| 国产综合18久久久久久| 亚洲欧美中文在线视频| 一本一本久久a久久精品综合麻豆| 欧美全黄视频| 国产亚洲精品久久久久动| 国内精品久久久久久久影视麻豆| 国内精品久久久久影院优| 国产亚洲一本大道中文在线| 国内精品国产成人| 久久精品人人做人人综合| 国产精品永久在线| 欧美在线一级视频| 久久中文精品| 欧美1级日本1级| 亚洲精品欧美| 国产精品盗摄一区二区三区| 久久精品人人爽| 亚洲精品乱码久久久久| 麻豆精品传媒视频| 嫩草伊人久久精品少妇av杨幂| 在线精品国精品国产尤物884a| 亚洲一区精品电影| 国产亚洲欧美日韩精品| 在线电影欧美日韩一区二区私密| 性久久久久久久久| 亚洲成色最大综合在线| 亚洲一区二区三区精品在线观看| 亚洲一区二区三区免费在线观看| 欧美激情精品久久久六区热门| 欧美精品日韩一区| 欧美日韩一区二区三区在线观看免| 99精品视频免费观看| 欧美日韩dvd在线观看| 亚洲男人影院| 伊人久久大香线蕉av超碰演员| 99视频精品全国免费| 亚洲一区二区三区精品在线| 欧美二区视频| 亚洲视频欧美视频| 美女精品网站| 国产婷婷色一区二区三区四区| 久久久久久夜精品精品免费| 国产精品久久夜| 尤物九九久久国产精品的特点| 欧美99久久| 国产亚洲欧美一区在线观看| 亚洲精品免费在线播放| 亚洲二区三区四区| 国产精品一区二区三区观看| 欧美破处大片在线视频| 亚洲国产欧美日韩另类综合| 久久午夜av| 欧美体内she精视频在线观看| 在线午夜精品自拍| 亚洲人成网站色ww在线| 极品尤物av久久免费看| 久久精品国产精品| 国产精品久久久久婷婷| 亚洲毛片视频| 国产精品免费视频观看| 亚洲午夜国产一区99re久久| 有码中文亚洲精品| 欧美福利一区二区三区| 国产精品你懂的在线| 久久久久久91香蕉国产| 日韩一区二区精品葵司在线| 国产欧美一区二区精品秋霞影院| 久久久91精品国产一区二区精品| 亚洲高清久久久| 亚洲欧洲精品一区二区三区| 久久野战av| 欧美在线亚洲在线| 欧美一区二区大片| 精品成人久久| 亚洲欧美日韩电影| 亚洲激情第一区| 亚洲图片欧美日产| 亚洲精一区二区三区| 亚洲深夜福利视频| 在线午夜精品自拍| 亚洲精品网站在线播放gif| 在线精品亚洲| 欧美日韩精品欧美日韩精品| 欧美日韩123| 久久男人av资源网站| 国产精品热久久久久夜色精品三区| 亚洲欧美福利一区二区| 欧美三级电影精品| 久久久久国产一区二区三区四区| 亚洲美女精品成人在线视频| 欧美精品色综合| 国产亚洲精品久久飘花| 亚洲国内高清视频| 国产日韩av高清| 在线精品高清中文字幕| 在线观看亚洲视频啊啊啊啊| 日韩一二三在线视频播| 99视频在线精品国自产拍免费观看| 亚洲国产精品电影在线观看| 亚洲激情第一区| 亚洲国产另类精品专区| 欧美精品免费在线观看| 欧美精品国产一区| 欧美激情一区二区在线| 国产精品青草久久久久福利99| 亚洲一区二区三区四区在线观看| 亚洲人成艺术| 国产欧美精品一区二区色综合| 99精品欧美一区| 欧美日韩亚洲天堂| 亚洲大胆美女视频| 亚洲激情校园春色| 久久久精品一品道一区| 欧美另类变人与禽xxxxx| 欧美日韩精品一二三区| 国产精品一区免费视频| 免费成人在线观看视频| 国内成人精品2018免费看| 午夜精品福利视频| 国产精品久久97| 欧美午夜剧场| 国产精品美女999| 麻豆精品传媒视频| 亚洲欧美日韩国产一区二区三区| 国产精品99久久久久久久久久久久| 亚洲人体影院| 久久午夜精品| 欧美色网在线| 国产免费观看久久| 国产欧美一区二区三区久久人妖| 激情伊人五月天久久综合| 国产伦精品一区二区三区视频孕妇| 国产综合色精品一区二区三区| av成人免费观看| 夜夜爽99久久国产综合精品女不卡| 亚洲五月六月| 欧美14一18处毛片| 欧美精品久久久久久| 欧美日韩亚洲一区在线观看| 午夜精品在线视频| 噜噜噜噜噜久久久久久91| 夜夜嗨网站十八久久| 亚洲日本欧美天堂| 在线观看成人小视频| 亚洲一区免费| 欧美影视一区| 在线视频免费在线观看一区二区| 久久综合综合久久综合| 久久精品国亚洲| 午夜久久黄色| 性欧美暴力猛交69hd| 久久综合99re88久久爱| 国产欧美日韩一区二区三区在线| 国产麻豆精品theporn| 99re热这里只有精品视频| 欧美三级日韩三级国产三级| 国产午夜精品久久久| 在线综合+亚洲+欧美中文字幕| 国产精品入口日韩视频大尺度| 国产精品私房写真福利视频| 国产精品福利在线观看网址| 国产欧美日韩精品丝袜高跟鞋| 久久一区精品| 国产一区日韩欧美| 欧美国产日韩一区二区三区| 国产精品久久婷婷六月丁香| 国产精品国产精品| 日韩视频在线观看| 国产日韩欧美一区二区三区在线观看| 麻豆成人av| 欧美精品亚洲| 国产精品一区二区久激情瑜伽| 亚洲视频第一页| 国产精品你懂的在线欣赏| 欧美伊人久久久久久午夜久久久久| 国产亚洲一区二区三区在线观看| 午夜精品三级视频福利| 久久国产精品亚洲va麻豆| 合欧美一区二区三区| 亚洲无线视频| 久久综合久久综合这里只有精品| 国产在线视频不卡二| 欧美伊人久久久久久午夜久久久久| 久久婷婷国产综合国色天香| 欧美一区二区三区在线播放| 开元免费观看欧美电视剧网站| 欧美jizz19性欧美| 国产精品毛片| 久久久久国色av免费看影院| 国产精品国产三级国产普通话99| 亚洲国产黄色片| 国产精品成人免费精品自在线观看| 91久久亚洲| 欧美国产在线视频| 亚洲久色影视| 久久精品2019中文字幕| 欧美日韩一区综合| 日韩一级裸体免费视频| 91久久国产综合久久蜜月精品| 欧美日韩一区二区三区高清| 午夜精品美女久久久久av福利| 欧美韩日一区二区三区| 国产精品电影观看| 亚洲欧美一区二区视频| 欧美一级专区| 国产在线乱码一区二区三区| 久久精品视频在线| 韩日成人av| 在线观看欧美日韩| 玖玖玖免费嫩草在线影院一区| 免费成人美女女| 你懂的视频一区二区| 免费成人av在线看| 一区二区免费在线观看| 亚洲电影在线观看| 久热爱精品视频线路一| 欧美日韩人人澡狠狠躁视频| 国产日韩精品一区二区三区在线| 久久久99免费视频| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲第一福利视频| 国产精品xxxav免费视频| 欧美国产先锋| 午夜精品福利电影| 亚洲福利视频网| 国产日韩欧美在线视频观看| 一区在线观看视频| 国产欧美一区二区三区视频| 香蕉视频成人在线观看| 一区二区三区四区五区精品视频| 亚洲青色在线| 欧美国产在线观看| 久久精品青青大伊人av| 欧美日韩国产免费| 国产欧美在线观看| 欧美日韩一区二区在线视频| 久久噜噜噜精品国产亚洲综合| 亚洲欧洲一区二区三区在线观看| 国产精品入口66mio| 久久久av水蜜桃| 久久国产精品久久久久久久久久| 欧美在线亚洲| 亚洲欧美日韩国产成人精品影院| 久久精品日韩一区二区三区| 久久综合九色欧美综合狠狠| 国产精品久久久爽爽爽麻豆色哟哟| 在线观看国产精品网站| 国产精品美女久久久久aⅴ国产馆| 亚洲六月丁香色婷婷综合久久| 亚洲欧美春色| 久久精品日韩一区二区三区| 韩日视频一区| 欧美日韩aaaaa|