緩衝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:使用軟引用,當內存緊張時,可以自動回收對象