關於對象池化技術

來源:互聯網
上載者:User
恰當地使用對象池化技術,可以有效地減少對象產生和初始化時的消耗,提高系統的運行效率。Jakarta Commons Pool組件提供了一整套用於實現對象池化的架構,以及若干種各具特色的對象池實現,可以有效地減少處理對象池化時的工作量,為其它重要的工作留下更多的精力和時間。

建立新的對象並初始化的操作,可能會消耗很多的時間。在這種對象的初始化工作包含了一些費時的操作(例如,從一台位於20,000千米以外的主機上讀出一些資料)的時候,尤其是這樣。在需要大量產生這樣的對象的時候,就可能會對效能造成一些不可忽略的影響。要緩解這個問題,除了選用更好的硬體和更棒的虛擬機器以外,適當地採用一些能夠減少對象建立次數的編碼技巧,也是一種有效對策。對象池化技術(Object Pooling)就是這方面的著名技巧,而Jakarta Commons Pool組件則是處理對象池化的得力外援。

對象池化技術
對象池化的基本思路是:將用過的對象儲存起來,等下一次需要這種對象的時候,再拿出來重複使用,從而在一定程度上減少頻繁建立對象所造成的開銷。用於充當儲存對象的“容器”的對象,被稱為“對象池”(Object Pool,或簡稱Pool)。

對於沒有狀態的對象(例如String),在重複使用之前,無需進行任何處理;對於有狀態的對象(例如StringBuffer),在重複使用之前,就需要把它們恢複到等同於剛剛產生時的狀態。由於條件的限制,恢複某個對象的狀態的操作不可能實現了的話,就得把這個對象拋棄,改用新建立的執行個體了。

並非所有對象都適合拿來池化——因為維護對象池也要造成一定開銷。對產生時開銷不大的對象進行池化,反而可能會出現“維護對象池的開銷”大於“產生新對象的開銷”,從而使效能降低的情況。但是對於產生時開銷可觀的對象,池化技術就是提高效能的有效原則了。

什麼時候不要池化
採用對象池化的本意,是要通過減少對象產生的次數,減少花在對象初始化上面的開銷,從而提高整體的效能。然而池化處理本身也要付出代價,因此,並非任何情況下都適合採用對象池化。

Dr. Cliff Click在JavaOne 2003上發表的《Performance Myths Exposed》中,給出了一組其它條件都相同時,使用與不使用對象池化技術的實際效能的比較結果。他的實測結果表明:

  • 對於類似Point這樣的輕量級對象,進行池化處理後,效能反而下降,因此不宜池化;
  • 對於類似Hashtable這樣的中量級對象,進行池化處理後,效能基本不變,一般不必池化(池化會使代碼變複雜,增大維護的難度);
  • 對於類似JPanel這樣的重量級對象,進行池化處理後,效能有所上升,可以考慮池化。

根據使用方法的不同,實際的情況可能與這一測量結果略有出入。在配置較高的機器和技術較強的虛擬機器上,不宜池化的對象的範圍可能會更大。不過,對於像網路和資料庫連接這類重量級的對象來說,目前還是有池化的必要。

基本上,只在重複產生某種對象的操作成為影響效能的關鍵因素的時候,才適合進行對象池化。如果進行池化所能帶來的效能提高並不重要的話,還是不採用對象池化技術,以保持代碼的簡明,而使用更好的硬體和更棒的虛擬機器來提高效能為佳。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.