本篇介紹一些常用的可用于系統(tǒng)性能優(yōu)化的組件和方法
1.緩沖(Buffer)
??????????? 緩沖區(qū)是一塊特定的內(nèi)存區(qū)域,開辟緩沖區(qū)的目的是通過緩解應(yīng)用程序上下層之間的性能差異,提高系統(tǒng)的性能,我們?cè)谌粘I钪凶畛R姷木彌_的例子就是:
?????????? 漏斗上層系統(tǒng)猶如入水口,下層猶如系統(tǒng),倒水猶如向磁盤寫東西,然而瓶口很細(xì),造成了性能瓶頸。所以為了加快速度,可以添加一個(gè)漏斗。漏斗的初始口徑很大,并擁有一定的容量,那么就可以先寫一部分?jǐn)?shù)據(jù)到緩沖區(qū),當(dāng)數(shù)據(jù)都進(jìn)入到緩沖區(qū)后,上次處理完畢,等待下層處理至完成。
????????? 注意:緩沖可以協(xié)調(diào)上層組件和下層組件的性能差,當(dāng)上層組件性能優(yōu)于下層組件時(shí),可以有效減少上層組件對(duì)下層組件的等待時(shí)間。基于這樣的結(jié)構(gòu),上層應(yīng)用組件不需要等待下層組件真實(shí)的接收全部組件,即可返回操作,加快了上層組件的處理速度,從而提高系統(tǒng)整體性能緩沖區(qū)最常用的場(chǎng)景就是IO流,由于IO操作很容易成為性能瓶頸,因此盡可能在IO讀寫中加入緩沖組建,提升系統(tǒng)性能
2.緩存(Cache)
???????? 緩存也是為提升系統(tǒng)性能而開辟的內(nèi)存空間,緩存的主要作用就是暫存數(shù)據(jù)處理結(jié)果,并提供下次訪問,在很多場(chǎng)合中,數(shù)據(jù)的處理或數(shù)據(jù)的獲取都可能會(huì)非常耗時(shí),當(dāng)數(shù)據(jù)請(qǐng)求量很大時(shí),頻繁的數(shù)據(jù)處理會(huì)耗盡CPU資源,緩存的作用就是將這些數(shù)據(jù)處理結(jié)果緩存起來,當(dāng)又其它線程或客戶端要查詢相同資源時(shí),可以省略對(duì)這些數(shù)據(jù)的處理流程,直接從緩存中取出處理結(jié)果,并返回給請(qǐng)求組件,從而提高系統(tǒng)的響應(yīng)時(shí)間。
????????? 最簡(jiǎn)單的緩存可以直接用HashMap實(shí)現(xiàn),當(dāng)然會(huì)遇到很多問題,比如什么時(shí)候清除不用的緩存數(shù)據(jù),如何防止緩存數(shù)據(jù)過多而導(dǎo)致內(nèi)存溢出等,當(dāng)然也可用WeakHashMap這個(gè)弱引用來維護(hù),從而降低了潛在的內(nèi)存溢出,然而對(duì)比與專業(yè)的緩存還是不足。目前又很多基于java的緩存框架,比如出自Hibernate的EHCache,它是Hibernate默認(rèn)的數(shù)據(jù)緩存方案;除此之外還有OSCache,JBossCache等。
3.對(duì)象復(fù)用--池
?????????? 對(duì)象復(fù)用是目前常用的一種系統(tǒng)優(yōu)化方式,核心思想即:如果一個(gè)類被頻繁的請(qǐng)求使用,那么不必每次都生成一個(gè)實(shí)例,可以將這個(gè)類的一些實(shí)例保存在一個(gè)“池”中,等需要時(shí)直接從池中取出。這個(gè)池就稱為對(duì)象池。實(shí)現(xiàn)上,它可能是一個(gè)數(shù)組,鏈表或者集合對(duì)象池運(yùn)用很廣,比如我們常用的線程池和數(shù)據(jù)庫(kù)連接池。
??????????? 線程池中保存著可以被重用的線程對(duì)象,當(dāng)有任務(wù)被提交到線程池的時(shí)候,系統(tǒng)并不需要再新建一個(gè)線程,而是直接從池中取出一個(gè)可用線程,執(zhí)行這個(gè)任務(wù),在任務(wù)結(jié)束后,再將這個(gè)線程對(duì)象返回到線程池中而不用關(guān)閉。由于線程的創(chuàng)建和銷毀很耗性能,所以采用這種方式可以有效的改善性能。
?????????? 數(shù)據(jù)庫(kù)連接池,它用于維護(hù)數(shù)據(jù)庫(kù)鏈接的集合,當(dāng)系統(tǒng)需要訪問數(shù)據(jù)庫(kù)時(shí)不需要重新簡(jiǎn)歷數(shù)據(jù)庫(kù)連接,可以直接從池中獲取,在數(shù)據(jù)庫(kù)操作完成時(shí)也不用關(guān)閉,直接返回到連接池中,由于數(shù)據(jù)庫(kù)的創(chuàng)建和銷毀是重量級(jí)操作,因此,避免這兩個(gè)重復(fù)頻繁的操作,對(duì)改善系統(tǒng)性能也很有意義。目前較為廣泛的數(shù)據(jù)庫(kù)連接池組件又C3P0和Proxool。注意:在程序中使用線程池和數(shù)據(jù)庫(kù)連接池,可以有效的改善系統(tǒng)在高并發(fā)下的性能,任何對(duì)性能敏感的系統(tǒng),都要考慮合理的配置這兩個(gè)組件。
4.并行替代串行
????????? 隨著多核時(shí)代的到來,cpu的并行能力有了很大的提升,在這種背景下,傳統(tǒng)的串行程序已經(jīng)無法發(fā)揮出cpu的性能,造成系統(tǒng)資源浪費(fèi),因此并行軟件開發(fā)可將cpu性能發(fā)揮出來java對(duì)多線程的支持為多核計(jì)算提供了保障。java中提供的Thread對(duì)象和Runnable接口用于創(chuàng)建進(jìn)程內(nèi)對(duì)象。其次,為了優(yōu)化程序性能,jdk還提供了java.util.concurrent并發(fā)包,內(nèi)置各種多線程性能優(yōu)化工具和組件,如線程池,各種并發(fā)數(shù)據(jù)結(jié)構(gòu)。
5.負(fù)載均衡