vickzhu

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

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

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

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

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

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

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

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

            對象池技術的基本原理

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

            實現一個對象池,一般會涉及到如下的類:

            1)對象池工廠(ObjectPoolFactory)類

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

            ·createPool:用于創建特定類型和設置的對象池;

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

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

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

            2)參數對象(ParameterObject)類

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

            3)對象池(ObjectPool)類

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

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

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

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

          評論

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


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


          網站導航:
           
          主站蜘蛛池模板: 岳池县| 龙游县| 揭西县| 普兰县| 全州县| 石河子市| 贵溪市| 金阳县| 平谷区| 建平县| 新蔡县| 浏阳市| 德庆县| 西林县| 娄底市| 遵义县| 望谟县| 乐至县| 芦山县| 临清市| 商都县| 临洮县| 辉县市| 闵行区| 缙云县| 外汇| 亚东县| 奉化市| 长白| 锦屏县| 庆安县| 于田县| 日照市| 台北市| 沾化县| 栾川县| 炉霍县| 青铜峡市| 建德市| 莱阳市| 盐津县|