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

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

2008-12-29
作者:吳良巧

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

2?對象引用分析
??? 在JAVA程序中,被靜態(Static)變量和全局(Global)變量直接或間接引用的對象不能被垃圾收集器收集。假如一個對象被一個靜態變量引用,即使該對象已經沒有用處了,但不能作為垃圾被收集,不僅如此,該對象直接和間接引用的所有對象都不能被收集。
??? 除了上述情況,在理論上,不被靜態變量和全局變量直接或間接引用其他的所有對象,即使它們之間存在著相互引用關系,也可以被垃圾收集器收集。但是,不管垃圾收集器如何工作,對象是否被靜態變量和全局變量直接或間接引用,對象引用關系越復雜,就需要花費更多的時間來處理。因此,由于垃圾收集器結構和算法上的局限,對于一些引用關系復雜的對象,需要經過多次或完全的垃圾收集才可以收集,導致垃圾收集器消耗額外的資源,影響垃圾收集的效率;對于引用關系特別復雜的對象,垃圾收集器可能就根本沒有足夠的時間來處理,容易造成內存的泄漏。
??? 為了說明對象的引用關系,下面以對話框" title="對話框">對話框及其組件為例說明。TestDialog從JDialog繼承,對話框中放置一個JButton按鈕,按鈕添加了一個動作監聽器(ActionListener)。
??? 以下是類的部分代碼:

??? 圖1為對話框和按鈕相關的主要對象的引用關系圖。這里方框表示對象實例(Instance)的類或類型,其中TestDialog$1為TestDialog的匿名內部類,就是添加到按鈕的ActionListener監聽器對象所對應的類;連接線表示對象引用關系,其中箭頭指向的對象被另一個對象直接引用,連接線旁的文字表示引用著被引用對象的屬性(變量),如TestDialog對象直接引用了JButton對象,JButton對象的引用保存在TestDialog的屬性testButton中;Object數組把對象的引用作為元素存放。
??? 從對象引用關系圖中可以看出,一個對象對另外一個對象的引用可能是直接的,也可以通過其他對象的引用發生間接引用。在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組件,這些組件內部的對象引用比較多。以 JButton 為例,為了清晰起見,圖2的對象引用關系圖只畫出了與? 數據模型(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與其他對象的引用路徑在這里不一一列舉。
??? 在這個例子中,一些組件對象已經存在比較復雜的引用關系,在通過與另一些對象又形成相互引用,組成了更加復雜的對象引用關系。在關閉對話框時,如果不作特別的操作,這些對象的引用關系將保持不變,對垃圾收集的效率產生有很大的影響。
??? 在存在引用關系的所有對象中,假如某個對象仍然是有用的,或者不恰當的被靜態變量和全局變量直接或間接引用,導致有引用關系的所有應該成為垃圾的對象都無法被收集,造成一定的內存泄漏。


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

3.1?清除直接對象引用

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

3.2?調用對象的特定方法

??? 當一個對象不再被使用時,如果對象提供了用來清除引用或釋放資源的方法,應該調用這些方法,但注意調用的時機或順序,避免引起異?,F象。這些方法包括對話框的dispose方法,容器組件的remove方法,Swing組件的UI的uninstall方法,移除監聽器方法等,也可以是某個類的本身定義的清除引用方法。
??? 在對話框的例子中,對話框的dispose方法主要釋放一些與本地有關的資源,若不調用,將不能清除對話框的一個全局引用,造成內存泄漏;容器的remove方法,該方法主要清除了容器的變量componet對數組的引用以及數組對子組件對象的引用,同時也清除了子組件對象中 的變量parent對容器對象的引用,若清除容器中的所有組件,則可簡單的調用removeAll方法清除;在JButton中,可以調用setMode(null)來設置Model,不僅清除了JButton對象中的model和changeListener對象引用,而且同時清除了DefaultButtonModel對 AbstractButton$ButtonChangeListener 監聽器對象的間接引用。 如果調用了上述的這些方法,在對話框例子中,許多的對象引用被清除,極大地簡化了各個對象之間的引用關系。

3.3?慎重使用內部類

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

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


參考文獻
?
1 [ISBN7-111-09635-5/TP-2242] Joshua Bloch 著.

2 Java 高效編程指南.北京:機械工業出版社,2002:3-12 .

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話: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国产| 亚洲欧美日韩综合一区| 国产一区二区三区直播精品电影| 久久蜜桃av一区精品变态类天堂| 久久精品国产第一区二区三区最新章节| 亚洲综合成人在线| 日韩亚洲欧美一区二区三区| 中文亚洲视频在线| 亚洲一区二区三区激情| 久久久久国色av免费看影院| 亚洲午夜精品| 欧美中文字幕在线| 国产精品久久久久久一区二区三区| 亚洲欧美日本另类| 一本色道久久88亚洲综合88| 亚洲国产精品久久精品怡红院| 亚洲精品乱码久久久久| 亚洲欧美成人精品| 日韩亚洲欧美一区| 国产在线视频不卡二| 亚洲人成人99网站| 狠狠88综合久久久久综合网| 国产日韩欧美在线一区| 樱桃国产成人精品视频| 亚洲国产精品va在看黑人| 亚欧美中日韩视频| 国产自产精品| 国产美女精品在线| 国产精品久久午夜夜伦鲁鲁| 国产日韩欧美一区二区三区在线观看| 国产精品家教| 老司机凹凸av亚洲导航| 欧美国产日韩视频| 国产精自产拍久久久久久蜜| 欧美尤物一区| 欧美日韩国产二区| 亚洲欧美一区二区激情| 日韩午夜在线| 一区在线视频观看| 中文成人激情娱乐网| 亚洲成在线观看| 久久午夜色播影院免费高清| 欧美激情一区二区三区蜜桃视频| 亚洲国产精彩中文乱码av在线播放| 国产精品爱久久久久久久| 国产精品久久久久久模特| 欧美屁股在线| 亚洲视频一区二区在线观看| 欧美日韩不卡| 精品动漫3d一区二区三区免费| 亚洲一区视频在线| 国产亚洲精品综合一区91| 欧美77777| aa日韩免费精品视频一| 久久精品国产精品亚洲综合| 久久伊人免费视频| 亚洲性视频网址| 亚洲精品国产无天堂网2021| 亚洲字幕一区二区| 欧美日韩欧美一区二区| 欧美日韩精品欧美日韩精品| 欧美一乱一性一交一视频| 亚洲第一页自拍| 亚洲黄色av| 午夜精品美女久久久久av福利| 久久久五月天| 欧美日韩亚洲一区二区三区| 欧美在线一区二区三区| 老妇喷水一区二区三区| 国产精品九色蝌蚪自拍| 在线日韩一区二区| 性色av一区二区三区在线观看| 欧美一区二区在线观看| 在线观看亚洲一区| 欧美成人国产| 怡红院av一区二区三区| 国产乱肥老妇国产一区二| 欧美怡红院视频一区二区三区| 亚洲欧美文学| 一本在线高清不卡dvd| 国产午夜精品美女毛片视频| 欧美成人一区二区三区| 一本色道久久综合精品竹菊| 国产精品狼人久久影院观看方式| 国产一区二区日韩精品欧美精品| 国产精品v片在线观看不卡| 午夜久久电影网| 亚洲欧洲一区二区三区| 久久久www成人免费无遮挡大片| 国产精品麻豆va在线播放| 亚洲精品久久久久| 羞羞视频在线观看欧美| 国内精品久久久久影院优| 国产一区二区三区视频在线观看| 久久偷窥视频| 亚洲欧美日韩国产成人精品影院| 国产午夜亚洲精品羞羞网站| 亚洲精品在线视频观看| 久久成人在线| 亚洲第一精品福利| 亚洲国产精品久久精品怡红院| 一区二区三区久久精品| 亚洲电影在线看| 亚洲欧美成人在线| 国产一区二区黄| 亚洲欧美日韩人成在线播放| 国产精品久久久久久久久免费| 欧美区亚洲区| 亚洲视频福利| 国产精品日韩| 亚洲综合色在线| **网站欧美大片在线观看| 快she精品国产999| 免费不卡欧美自拍视频| 亚洲综合丁香| 国产自产在线视频一区| 国产精品一区亚洲| 亚洲视频免费| 欧美日韩国产精品成人| 欧美一区二区视频在线| 欧美四级在线| 欧美日韩成人综合在线一区二区| 日韩亚洲欧美一区二区三区| 在线观看视频亚洲| 伊人久久av导航| 欧美亚洲成人免费| 在线观看亚洲精品| 久久美女艺术照精彩视频福利播放| 亚洲成色777777在线观看影院| 欧美成人精品在线| 国产精品美女一区二区在线观看| 国产在线视频欧美| 国内精品久久久久久久97牛牛| 亚洲欧美一区二区视频| 欧美偷拍一区二区| 日韩午夜在线视频| 欧美日韩伦理在线| 午夜视频精品| 亚洲国产一成人久久精品| 久久精品免费看| 久久综合色婷婷| 亚洲黄色三级| 国内精品视频久久| 欧美 日韩 国产在线| 久热精品在线视频| 国产精品久久久久久久久久久久久久| 久久成人在线| 在线一区欧美| 国产视频一区二区在线观看| 亚洲午夜成aⅴ人片| 欧美激情一区在线观看| 一本色道精品久久一区二区三区| 国产精品高潮久久| 有码中文亚洲精品| 国产一区二区三区最好精华液| 国产精品中文字幕欧美| 久久久久久**毛片大全| 亚洲欧洲另类国产综合| 亚洲一区二区三区精品视频| 亚洲精品之草原avav久久| 欧美精品videossex性护士| 欧美gay视频激情| 欧美高清视频免费观看| 鲁大师影院一区二区三区| 欧美日韩一区不卡| 韩日成人av| 亚洲国产免费看| 欧美乱大交xxxxx| 亚洲精品免费在线| 国产精品爽爽ⅴa在线观看| 亚洲女同性videos| 亚洲乱码视频| 亚洲国产视频一区二区| 国产精品免费网站在线观看| 亚洲精品在线二区| 蜜臀久久99精品久久久久久9| 中文日韩在线| av成人免费在线| 欧美www视频| 欧美成人免费视频| 亚洲香蕉视频| 国产精品青草久久| 亚洲剧情一区二区| 1769国产精品| 亚洲欧美激情一区二区| 国产精品a久久久久| 日韩午夜一区| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美一区二区精品在线| 亚洲一区二区三区高清| 欧美连裤袜在线视频| 亚洲欧美日韩精品在线| 欧美日韩美女一区二区| 99成人在线| 亚洲一级黄色av| 日韩视频中文字幕| 在线免费一区三区| 在线亚洲免费视频| 国产原创一区二区| 美女啪啪无遮挡免费久久网站| 一本一本久久a久久精品综合麻豆| 国产精品亚洲综合一区在线观看| 午夜视黄欧洲亚洲| 久久成人亚洲| 欧美日韩八区| 亚洲高清久久网| 一区一区视频| 美日韩精品免费| 国产日韩专区| 亚洲社区在线观看| 在线不卡中文字幕播放| 国产欧美日本一区视频| 亚洲激情婷婷| 亚洲欧美视频在线观看| 欧美激情精品久久久久久免费印度| 狠狠操狠狠色综合网| 欧美综合第一页| 国产亚洲精品一区二555| 亚洲少妇在线| 99精品国产在热久久| 亚洲一区尤物| 欧美三级在线| 国产精品porn| 国产欧美精品国产国产专区| 女生裸体视频一区二区三区| 久久久999| 国内外成人免费激情在线视频| 欧美顶级大胆免费视频| 亚洲午夜黄色| 欧美日韩中文字幕综合视频| 亚洲一区二区黄| 在线欧美亚洲| 夜夜嗨av色综合久久久综合网| 激情综合网址| 亚洲免费网址| 韩日欧美一区二区| 国产精品久久久一区二区| 欧美日韩精品伦理作品在线免费观看| 一本一本久久a久久精品综合妖精| 欧美看片网站| 亚洲一区二区三区四区视频| 欧美亚洲一区二区在线观看| 一区二区三区精品在线| 亚洲视频自拍偷拍| 国产欧美日韩视频在线观看| 国产精品久久一区二区三区| 亚洲欧美区自拍先锋| 欧美在线视频观看| 午夜精品久久久久久99热| 在线欧美电影| 激情欧美一区| 国产精品私拍pans大尺度在线| 亚洲午夜久久久久久尤物| 在线看日韩欧美| 欧美成人福利视频| 亚洲午夜成aⅴ人片| 国产亚洲制服色| 在线精品一区| 久久成人18免费网站| 欧美激情欧美狂野欧美精品| 国产一区二区主播在线| 国产亚洲精品激情久久| 欧美日韩国产123区| 欧美亚洲免费| 国产精品日日做人人爱| 欧美精品一区二区久久婷婷| 蜜桃av噜噜一区| 亚洲自啪免费| 一区二区三区日韩精品视频| 国产丝袜美腿一区二区三区| 欧美一区二区免费视频| 91久久午夜| 欧美日韩国产三区| 国产欧美一区二区白浆黑人| 亚洲视频在线观看视频| 国产一区二区三区四区在线观看| 亚洲精品一区二| 亚洲日本成人女熟在线观看| 亚洲三级视频在线观看| 国产一区二区黄色| 亚洲福利视频专区| 久久久久久久久久久成人| 欧美日韩中文字幕日韩欧美| 亚洲制服欧美中文字幕中文字幕| 国产欧亚日韩视频| 亚洲性视频网站| 在线天堂一区av电影| 久久精品视频亚洲| 亚洲美女在线看| 欧美日韩在线大尺度| 国产精品一二| 亚洲一区二区三区四区在线观看| 国产精品swag| 日韩一级免费| 老司机午夜精品视频| 亚洲午夜激情网页| 欧美成人高清| 国内欧美视频一区二区| 亚洲欧洲精品一区二区三区| 亚洲国产一成人久久精品| 国产欧美精品一区二区色综合| 久久久久成人网| 久久精品99国产精品日本| 欧美午夜电影一区| 激情六月综合| 欧美在线视频免费观看| 亚洲欧美在线视频观看| 欧美成人亚洲成人日韩成人| 国产欧美一区二区在线观看| 久久婷婷国产麻豆91天堂| 国产精品va在线播放我和闺蜜| 久久精品网址| 国产精品videossex久久发布| 国产精品99久久久久久久女警| 久久都是精品| 国产美女一区二区| 欧美综合第一页| 亚洲精品国产精品乱码不99| 亚洲图色在线| 伊人蜜桃色噜噜激情综合| 亚洲欧美综合精品久久成人| 免费在线亚洲欧美| 一本色道**综合亚洲精品蜜桃冫| 欧美日韩高清免费| 亚洲观看高清完整版在线观看| 99www免费人成精品|