




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、對象池技術的原理及其實現 摘 要 本文在分析對象池技術基本原理的基礎上,給出了對象池技術的兩種實現方式。還指出了使用對象池技術時所應注意的問題。 關鍵詞 對象池;對象池技術;Java 對象;性能 1 Java對象的生命周期分析 Java對象的生命周期大致包括三個階段:對象的創建,對象的使用,對象的清除。因此,對象的生命周期長度可用如下的表達式表示:T&
2、#160;= T1 + T2 +T3。其中T1表示對象的創建時間,T2表示對象的使用時間,而T3則表示其清除時間。由此,我們可以看出,只有T2是真正有效的時間,而T1、T3則是對象本身的開銷。下面再看看T1、T3在對象的整個生命周期中所占的比例。 我們知道,Java對象是通過構造函數來創建的,在這一過程中,該構造函數鏈中的所有構造函數也都會被自動調用。另外,默認情況下,調用類的構造函數時,Java會把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,
3、float和double變量設置成0.0,邏輯值設置成false。所以用new關鍵字來新建一個對象的時間開銷是很大的,如表1所示。表1 一些操作所耗費時間的對照表運算操作示例標準化時間本地賦值i = n1.0實例賦值this.i = n1.2方法調用Funct()5.9新建對象New Object()980新建數組New int103100 從表1可以看出,新建一個對象需要980個單位的時間,是本地賦值時間的980倍,是方法調用時間的166倍,而若新建一個數組所花費的
4、時間就更多了。 再看清除對象的過程。我們知道,Java語言的一個優勢,就是Java程序員勿需再像C/C+程序員那樣,顯式地釋放對象,而由稱為垃圾收集器(Garbage Collector)的自動內存管理系統,定時或在內存凸現出不足時,自動回收垃圾對象所占的內存。凡事有利總也有弊,這雖然為Java程序設計者提供了極大的方便,但同時它也帶來了較大的性能開銷。這種開銷包括兩方面,首先是對象管理開銷,GC為了能夠正確釋放對象,它必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等。其次,在GC開始回收“垃圾”對象時,系統會暫停應用程
5、序的執行,而獨自占用CPU。 因此,如果要改善應用程序的性能,一方面應盡量減少創建新對象的次數;同時,還應盡量減少T1、T3的時間,而這些均可以通過對象池技術來實現。2 對象池技術的基本原理 對象池技術基本原理的核心有兩點:緩存和共享,即對于那些被頻繁使用的對象,在使用完后,不立即將它們釋放,而是將它們緩存起來,以供后續的應用程序重復使用,從而減少創建對象和釋放對象的次數,進而改善應用程序的性能。事實上,由于對象池技術將對象*在一定的數量,也有效地減少了應用程序內存上的開銷。
6、60; 實現一個對象池,一般會涉及到如下的類: 1)對象池工廠(ObjectPoolFactory)類該類主要用于管理相同類型和設置的對象池(ObjectPool),它一般包含如下兩個方法: ·createPool:用于創建特定類型和設置的對象池; ·destroyPool:用于釋放指定的對象池; 同時為保證ObjectPoolFactory的單一實例,可以采
7、用Singleton設計模式,見下述getInstance方法的實現: public static ObjectPoolFactory getInstance() if (poolFactory =
8、0;null) poolFactory = new ObjectPoolFactory();
9、 return poolFactory; 2)參數對象(ParameterObject)類 該類主要用于封裝所創建對象池的一些屬性參數,如池中可存放對象的數目的最大
10、值(maxCount)、最小值(minCount)等。 3)對象池(ObjectPool)類 用于管理要被池化對象的借出和歸還,并通知PoolableObjectFactory完成相應的工作。它一般包含如下兩個方法: ·getObject:用于從池中借出對象; ·returnObject:將池化對象返回到池中,并通知所有處于等待狀態的線程;
11、60;4)池化對象工廠(PoolableObjectFactory)類該類主要負責管理池化對象的生命周期,就簡單來說,一般包括對象的創建及銷毀。該類同ObjectPoolFactory一樣,也可將其實現為單實例。3 通用對象池的實現 對象池的構造和管理可以按照多種方式實現。最靈活的方式是將池化對象的Class類型在對象池之外指定,即在ObjectPoolFactory類創建對象池時,動態指定該對象池所池化對象的Class類型,其實現代碼如下:. . .public ObjectPool
12、createPool(ParameterObject paraObj,
13、160; Class clsType) return new ObjectPool(paraObj, clsType); . . . 其中,
14、paraObj參數用于指定對象池的特征屬性,clsType參數則指定了該對象池所存放對象的類型。對象池(ObjectPool)創建以后,下面就是利用它來管理對象了,具體實現如下:public class ObjectPool private ParameterObject paraObj;/該對象池的屬性參數對象 private Class clsType;/該對象池中所存放對象的類型 private int currentNum
15、0;= 0; /該對象池當前已創建的對象數目 private Object currentObj;/該對象池當前可以借出的對象 private Vector pool;/用于存放對象的池 public ObjectPool(ParameterObject paraObj, Class clsType)
16、 this.paraObj = paraObj; this.clsType = clsType; pool = new Vector(); public Object&
17、#160;getObject() if (pool.size() <= paraObj.getMinCount() if (current
18、Num <= paraObj.getMaxCount() /如果當前池中無對象可用,而且已創建的對象數目小于所*的最大值,就利用
19、160; /PoolObjectFactory創建一個新的對象
20、 PoolableObjectFactory objFactory =
21、0; PoolableObjectFactory.getInstance(); currentObj = objFactory.create Object
22、 (clsType); currentNum+;
23、160; else /如果當前池中無對象可用,而且所創建的對象數目已達到所*的最大值, &
24、#160; /就只能等待其它線程返回對象到池中
25、160; synchronized (this)
26、160; try
27、; wait(); catch (InterruptedException
28、160;e) System.out.println(e.getMessage();
29、160; e.printStackTrace();
30、
31、 currentObj = pool.firstElement();
32、;
33、; else /如果當前池中有可用的對象,就直接從池中取出對象 current
34、Obj = pool.firstElement(); return currentObj; public void returnObject(Object obj)
35、0; / 確保對象具有正確的類型 if (obj.isInstance(clsType) pool.addElement(obj);
36、; synchronized (this) notifyAll();
37、; else throw new IllegalArgumentException("該對象池不能存放指定的對象類型");
38、; 從上述代碼可以看出,ObjectPool利用一個java.util.Vector作為可擴展的對象池,并通過它的構造函數來指定池化對象的Class類型及對象池的一些屬性。在有對象返回到對象池時,它將檢查對象的類型是否正確。當對象池里不再有可用對象時,它或者等待已被使用的池化對象返回池中,或者創建一個新的對象實例。不過,新對象實例的創建并不在ObjectPool類中,而是由PoolableObjectFactory類的createObject方法來完成的,具體實現如下:. . . &
39、#160; public Object createObject(Class clsType) Object obj = null;
40、160; try obj = clsType.newInstance();
41、60; catch (Exception e) e.printStackTrace();
42、160; return obj;
43、0;. . . 這樣,通用對象池的實現就算完成了,下面再看看客戶端(Client)如何來使用它,假定池化對象的Class類型為StringBuffer:. . ./創建對象池工廠 ObjectPoolFactory poolFactory = ObjectPoolFactory. getInstance ();
44、; /定義所創建對象池的屬性 ParameterObject paraObj = new ParameterObject(2,1); /利用對象池工廠,創建一個存放StringBuffer類型對象的對象池 &
45、#160; ObjectPool pool = poolFactory.createPool(paraObj,String Buffer.class); /從池中取出一個StringBuffer對象 StringBuffer buffer = (StringBuffer)pool.getObject();&
46、#160; /使用從池中取出的StringBuffer對象 buffer.append("hello"); System.out.println(buffer.toString(); . .
47、160;. 可以看出,通用對象池使用起來還是很方便的,不僅可以方便地避免頻繁創建對象的開銷,而且通用程度高。但遺憾的是,由于需要使用大量的類型定型(cast)操作,再加上一些對Vector類的同步操作,使得它在某些情況下對性能的改進非常有限,尤其對那些創建周期比較短的對象。4 專用對象池的實現 由于通用對象池的管理開銷比較大,某種程度上抵消了重用對象所帶來的大部分優勢。為解決該問題,可以采用專用對象池的方法。即對象池所池化對象的Class類型不是動態指定的,而是預先就已
48、指定。這樣,它在實現上也會較通用對象池簡單些,可以不要ObjectPoolFactory和PoolableObjectFactory類,而將它們的功能直接融合到ObjectPool類,具體如下(假定被池化對象的Class類型仍為StringBuffer,而用省略號表示的地方,表示代碼同通用對象池的實現):public class ObjectPool private ParameterObject paraObj;/該對象池的屬性參數對象
49、 private int currentNum = 0; /該對象池當前已創建的對象數目 private StringBuffer currentObj;/該對象池當前可以借出的對象 private V
50、ector pool;/用于存放對象的池 public ObjectPool(ParameterObject paraObj) this.paraObj = paraObj;
51、0; pool = new Vector(); public StringBuffer getObject()
52、 if (pool.size() <= paraObj.getMinCount() if (currentNum <= paraObj.getMaxCount() currentObj = new StringBuffer();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 碳酸飲料行業新興市場機會考核試卷
- 棉麻行業生產設備選型與評價考核試卷
- 環境監測無人機技術應用考核試卷
- 液力機械在游樂設施中的應用考核試卷
- 碳超級電容器制造技術發展現狀考核試卷
- 漁業電子商務案例分析考核試卷
- 經濟林樹種育種新技術考核試卷
- 武漢晴川學院《環境土壤學》2023-2024學年第二學期期末試卷
- 遼寧廣告職業學院《診斷學A》2023-2024學年第一學期期末試卷
- 武夷山職業學院《生物質復合材料》2023-2024學年第二學期期末試卷
- 定密培訓課件
- 中醫護理方案的應用
- 《馬克思主義原理》課件
- 新生兒常見導管護理
- 家政服務行業環保管理制度
- 完整的欠貨款協議書范文范本
- 2024年山東省濟寧市中考生物試題卷(含答案解析)
- 浙美版小學二年級下冊美術教學計劃及教案全冊
- 健合集團在線測評原題
- 公路工程標準施工招標文件(2018年版)
- 個人理財-形考作業4(第8-9章)-國開(ZJ)-參考資料
評論
0/150
提交評論