java程序性能優化之設計優化--優化組件和方法(2)

本篇介紹一些常用的可用於系統性能優化的組件和方法

  1. 緩衝(Buffer)

    緩衝區是一塊特定的內存區域,開闢緩衝區的目的是通過緩解應用程序上下層之間的性能差異,提高系統的性能,我們在日常生活中最常見的緩衝的例子就是: 漏斗
    這裏寫圖片描述

    上次系統猶如入水口,下層猶如系統,倒水猶如向磁盤寫東西,然而瓶口很細,造成了性能瓶頸。所以爲了加快速度,可以添加一個漏斗。
    漏斗的初始口徑很大,並擁有一定的容量,那麼就可以先寫一部分數據到緩衝區,當數據都進入到緩衝區後,上次處理完畢,等待下層處理至完成。
    注意:緩衝可以協調上層組件和下層組件的性能差,當上層組件性能優於下層組件時,可以有效減少上層組件對下層組件的等待時間。
    基於這樣的結構,上層應用組件不需要等待下層組件真實的接收全部組件,即可返回操作,加快了上層組件的處理速度,從而提高系統整體性能
    緩衝區最常用的場景就是IO流,由於IO操作很容易成爲性能瓶頸,因此儘可能在IO讀寫中加入緩衝組建,提升系統性能

  2. 緩存(Cache)

    緩存也是爲提升系統性能而開闢的內存空間,緩存的主要作用就是暫存數據處理結果,並提供下次訪問,
    在很多場合中,數據的處理或數據的獲取都可能會非常耗時,當數據請求量很大時,頻繁的數據處理會耗盡CPU資源,緩存的作用就是將這些數據處理結果緩存起來,當又其它線程或客戶端要查詢相同資源時,可以省略對這些數據的處理流程,直接從緩存中取出處理結果,並返回給請求組件,從而提高系統的響應時間。
    最簡單的緩存可以直接用HashMap實現,當然會遇到很多問題,比如什麼時候清除不用的緩存數據,如何防止緩存數據過多而導致內存溢出等,當然也可用WeakHashMap這個弱引用來維護,從而降低了潛在的內存溢出,然而對比與專業的緩存還是不足。
    目前又很多基於java的緩存框架,比如出自Hibernate的EHCache,它是Hibernate默認的數據緩存方案;除此之外還有OSCache,JBossCache等。

  3. 對象複用–池

    對象複用是目前常用的一種系統優化方式,核心思想即:如果一個類被頻繁的請求使用,那麼不必每次都生成一個實例,可以將這個類的一些實例保存在一個“池”中,等需要時直接從池中取出。這個池就稱爲對象池。實現上,它可能是一個數組,鏈表或者集合
    對象池運用很廣,比如我們常用的線程池和數據庫連接池,線程池中保存着可以被重用的線程對象,當有任務被提交到線程池的時候,系統並不需要再新建一個線程,而是直接從池中取出一個可用線程,執行這個任務,在任務結束後,再將這個線程對象返回到線程池中而不用關閉。由於線程的創建和銷燬很耗性能,所以採用這種方式可以有效的改善性能。
    數據庫連接池,它用於維護數據庫鏈接的集合,當系統需要訪問數據庫時不需要重新簡歷數據庫連接,可以直接從池中獲取,在數據庫操作完成時也不用關閉,直接返回到連接池中,由於數據庫的創建和銷燬是重量級操作,因此,避免這兩個重複頻繁的操作,對改善系統性能也很有意義。目前較爲廣泛的數據庫連接池組件又C3P0和Proxool。
    注意:在程序中使用線程池和數據庫連接池,可以有效的改善系統在高併發下的性能,任何對性能敏感的系統,都要考慮合理的配置這兩個組件。

  4. 並行替代串行

    隨着多核時代的到來,cpu的並行能力有了很大的提升,在這種背景下,傳統的串行程序已經無法發揮出cpu的性能,造成系統資源浪費,因此並行軟件開發可將cpu性能發揮出來
    java對多線程的支持爲多核計算提供了保障。java中提供的Thread對象和Runnable接口用於創建進程內對象。其次,爲了優化程序性能,jdk還提供了java.util.concurrent併發包,內置各種多線程性能優化工具和組件,如線程池,各種併發數據結構。

  5. 負載均衡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章