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

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

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

    vickzhu

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      151 隨筆 :: 0 文章 :: 34 評論 :: 0 Trackbacks
     Java對象的生命周期分析

      Java對象的生命周期大致包括三個階段:對象的創(chuàng)建,對象的使用,對象的清除。因此,對象的生命周期長度可用如下的表達式表示:T = T1 + T2 +T3。其中T1表示對象的創(chuàng)建時間,T2表示對象的使用時間,而T3則表示其清除時間。由此,我們可以看出,只有T2是真正有效的時間,而T1、T3則是對象本身的開銷。下面再看看T1、T3在對象的整個生命周期中所占的比例。

      我們知道,Java對象是通過構(gòu)造函數(shù)來創(chuàng)建的,在這一過程中,該構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)也都會被自動調(diào)用。另外,默認情況下,調(diào)用類的構(gòu)造函數(shù)時,Java會把變量初始化成確定的值:所有的對象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。所以用new關(guān)鍵字來新建一個對象的時間開銷是很大的,如表1所示。

      表1 一些操作所耗費時間的對照表

    運算操作 示例 標準化時間 
    本地賦值 i = n 1.0 
    實例賦值 this.i = n 1.2 
    方法調(diào)用 Funct() 5.9 
    新建對象 New Object()  980 
    新建數(shù)組 New int[10]  3100 

      從表1可以看出,新建一個對象需要980個單位的時間,是本地賦值時間的980倍,是方法調(diào)用時間的166倍,而若新建一個數(shù)組所花費的時間就更多了。

      再看清除對象的過程。我們知道,Java語言的一個優(yōu)勢,就是Java程序員勿需再像C/C++程序員那樣,顯式地釋放對象,而由稱為垃圾收集器(Garbage Collector)的自動內(nèi)存管理系統(tǒng),定時或在內(nèi)存凸現(xiàn)出不足時,自動回收垃圾對象所占的內(nèi)存。凡事有利總也有弊,這雖然為Java程序設(shè)計者提供了極大的方便,但同時它也帶來了較大的性能開銷。這種開銷包括兩方面,首先是對象管理開銷,GC為了能夠正確釋放對象,它必須監(jiān)控每一個對象的運行狀態(tài),包括對象的申請、引用、被引用、賦值等。其次,在GC開始回收“垃圾”對象時,系統(tǒng)會暫停應(yīng)用程序的執(zhí)行,而獨自占用CPU。

      因此,如果要改善應(yīng)用程序的性能,一方面應(yīng)盡量減少創(chuàng)建新對象的次數(shù);同時,還應(yīng)盡量減少T1、T3的時間,而這些均可以通過對象池技術(shù)來實現(xiàn)。

      對象池技術(shù)的基本原理

      對象池技術(shù)基本原理的核心有兩點:緩存和共享,即對于那些被頻繁使用的對象,在使用完后,不立即將它們釋放,而是將它們緩存起來,以供后續(xù)的應(yīng)用程序重復(fù)使用,從而減少創(chuàng)建對象和釋放對象的次數(shù),進而改善應(yīng)用程序的性能。事實上,由于對象池技術(shù)將對象限制在一定的數(shù)量,也有效地減少了應(yīng)用程序內(nèi)存上的開銷。

      實現(xiàn)一個對象池,一般會涉及到如下的類:

      1)對象池工廠(ObjectPoolFactory)類

      該類主要用于管理相同類型和設(shè)置的對象池(ObjectPool),它一般包含如下兩個方法:

      ·createPool:用于創(chuàng)建特定類型和設(shè)置的對象池;

      ·destroyPool:用于釋放指定的對象池;

      同時為保證ObjectPoolFactory的單一實例,可以采用Singleton設(shè)計模式,見下述getInstance方法的實現(xiàn):

    public static ObjectPoolFactory getInstance() {
     if (poolFactory == null) {
      poolFactory = new ObjectPoolFactory();
     }
     return poolFactory;
    }

      2)參數(shù)對象(ParameterObject)類

      該類主要用于封裝所創(chuàng)建對象池的一些屬性參數(shù),如池中可存放對象的數(shù)目的最大值(maxCount)、最小值(minCount)等。

      3)對象池(ObjectPool)類

      用于管理要被池化對象的借出和歸還,并通知PoolableObjectFactory完成相應(yīng)的工作。它一般包含如下兩個方法:

       ·getObject:用于從池中借出對象;
       ·returnObject:將池化對象返回到池中,并通知所有處于等待狀態(tài)的線程;

      4)池化對象工廠(PoolableObjectFactory)類

      該類主要負責(zé)管理池化對象的生命周期,就簡單來說,一般包括對象的創(chuàng)建及銷毀。該類同ObjectPoolFactory一樣,也可將其實現(xiàn)為單實例。
    posted on 2008-09-03 16:41 筱 筱 閱讀(580) 評論(1)  編輯  收藏

    評論

    # re: Java對象池技術(shù)的原理及其實現(xiàn) --Java對象的生命周期分析 2008-11-03 08:56 dysh61301601
    你的這篇文章不錯,我轉(zhuǎn)載了。謝謝。
    http://blog.csdn.net/dysh61301601  回復(fù)  更多評論
      


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 最近最新的免费中文字幕| 久久国内免费视频| 亚洲男人的天堂www| 深夜久久AAAAA级毛片免费看| 永久久久免费浮力影院| 亚洲成a人无码亚洲成av无码| 免费看a级黄色片| 理论片在线观看免费| 亚洲av无码专区在线观看素人| 香蕉视频免费在线播放| 亚洲精品A在线观看| 怡红院免费的全部视频| 国产亚洲欧洲精品| 美女内射毛片在线看免费人动物| 亚洲熟妇无码爱v在线观看| 成年男女男精品免费视频网站| 亚洲中文字幕乱码一区| 亚洲成av人片不卡无码久久| 久久久久久av无码免费看大片| 久久精品国产精品亚洲色婷婷| 久久久久高潮毛片免费全部播放| 亚洲色av性色在线观无码| 岛国大片免费在线观看| 美女黄频a美女大全免费皮| 亚洲人成中文字幕在线观看| 亚洲视频免费在线观看| 亚洲综合一区二区三区四区五区| 国产成人啪精品视频免费网| 岛国岛国免费V片在线观看| 亚洲电影免费观看| 免费看国产一级特黄aa大片| 黄页免费在线观看 | 国产高清免费视频| 性色av极品无码专区亚洲| 久久久久亚洲爆乳少妇无 | 成人免费看吃奶视频网站| 高潮毛片无遮挡高清免费| 久久久久亚洲Av无码专| 免费观看日本污污ww网站一区| 97在线免费视频| 亚洲AV色欲色欲WWW|