JAVA性能調優之緩衝、緩存、對象池化

緩衝Buffer

緩衝類似生活中的漏斗的作用,經常用在文件寫入時提高I/O的速度,由於CPU處理特別快,而I/O卻相對較慢,所以可以先將內容寫入內存中,當數據達到一定量時,一起寫入文件中,比如設計模式中裝飾模式提到的BufferedWriter

不採用緩存的方式
new DataoutputStream(new FileOutputStream("d:\\test.txt"))
new FileWriter(new File("file.txt"))
採用緩存的方式
new BufferedoutputStream(new DataoutputStream(new FileOutputStream("d:\\test.txt")))
new BufferedWriter(new FileWriter(new File("file.txt")))

緩存Cache

與緩衝相反的是,緩存一般是用在讀取數據,如果讀取數據較慢,而數據有使用比較頻繁的情況,我們可以將數據在第一次獲取後存入內存中,供下次訪問,常用的緩存例子如下:

  • 設計模式中的享元模式、動態代理
  • 熟悉動態規劃的同學就知道,動態規劃的核心就是很好的利用數據的緩存
  • 瀏覽器也會將你經常訪問的網頁緩存起來
  • Java常用的緩存框架:EHCache(Hibernate)、OSCache(可以緩存任何對象)、JBossCache(JBoss集羣共享數據)
注意

但是緩存需要注意維護緩存數據,不宜過多,否則可能導致內存溢出,需要及時清理,比如使用WeakHashmap等能自動消除不常用數據的組件

對象池化

核心思想是將一個頻繁使用的類,保存在一個“池”中,帶需要的時候,直接獲取,可以用數組鏈表或者任何集合實現。比如:

  • 線程池:由於創建銷燬特別費時間,所以當我們需要時,從“池”中獲得,當用完後,放回“池”中
  • 數據庫連接池:數據庫連接的創建銷燬同樣耗時,所以原理同線程池一樣
注意
  • 對象池化一般針對於創建對象開銷特別大的對象,否則維護對象池的成本遠遠大於帶來的好處
  • 頻繁的創建類(new)並不會影響性能,構造函數耗時,纔是創建類開銷特別大的原因
Jakarta CommonsPool對象池組件

內置了3個對象池

  • StackObjectPool(堆):利用Stack保存對象
  • GenericObjectPool:通用的對象池,可以通過各種參數調用它
  • SoftReferenceObjectPool:使用軟引用,當內存緊張時,可以自動回收對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章