国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

筆記《Java程序性能優(yōu)化 讓你的Java程序更快、更穩(wěn)定》 第二章 設計調優(yōu)

2019-11-14 23:51:24
字體:
來源:轉載
供稿:網友
筆記《java程序性能優(yōu)化 讓你的Java程序更快、更穩(wěn)定》 第二章 設計調優(yōu)

2.1 善用設計模式 23 (1)

1. 設計模式好處;

clip_image001[6]

2.1.1 單例模式 23 (6)

1. 單例模式一種對象創(chuàng)建模式,用于產生一個對象的具體實例,它可以確保系統(tǒng)中一個類只產生一個實例;

2. 兩大好處:a、對于頻繁創(chuàng)建的對象,可以省略創(chuàng)建對象所花費的時間;b、new操作減少,因而對系統(tǒng)內存的使用頻率也會降低,降低GC壓力,縮短GC停頓時間;

3. 單例模式的參與者:單例類和使用者;

4. 第一種實現(xiàn)方式:私有默認構造器,靜態(tài)getInstance方法;這種實現(xiàn)方式簡單、可靠,但不能延遲加載;

5. 第二種實現(xiàn)方式:私有默認構造器,創(chuàng)建時判斷對象是否為空,提供同步的getInstance方法;這種實現(xiàn)方式雖然能夠延遲加載,但引入了同步,多線程時時耗遠遠大于第一種實現(xiàn);

6. 第三種實現(xiàn)方式:私有默認構造器,私有靜態(tài)內部類里邊創(chuàng)建私有靜態(tài)的實例,靜態(tài)getInstance方法;當getInstance被調用時,才會加載SingletonHolder,從而初始化instance,同時,由于實例的建立是在類加載時完成的,故天生對多線程友好;

clip_image003

clip_image005[6]

第一種實現(xiàn):

clip_image007[6]

這種單例的實現(xiàn)方式簡單、有效,但是不能延遲加載;

clip_image009[6]

clip_image011[6]

clip_image013

第二種實現(xiàn)方式,引入延遲加載:

clip_image015

clip_image017

clip_image019

第三種實現(xiàn)方式:

clip_image021

clip_image023

clip_image025

clip_image027

clip_image029

clip_image031

clip_image033

clip_image035

2.1.2 代理模式 28 (17)

1. 使用代理對象完成用戶請求,屏蔽用戶對真實對象的訪問;

2. 使用代理模式的意圖:安全原因、遠程調用、延遲加載(提升系統(tǒng)的性能和反應速度);

3. 代理模式的主要參與者:主題接口、真實主題、代理類、客戶端;

4. 延遲加載的常用案例:數據庫連接、系統(tǒng)啟動,hibernate框架;

5. 延遲加載的核心思想:如果當前并沒有使用該組件,則不需要真正地初始化它,使用一個代理對象替代它原有的位置,只要在真正需要使用的時候,才對它進行加載;

6. 動態(tài)代理是指在運行時,動態(tài)生成代理類;

7. 和靜態(tài)代理相比,動態(tài)代理的好處:1、不需要為真實主題寫一個形式上完全一樣的封裝類,2、使用一些動態(tài)代理的生成方法甚至可以在運行時指定代理類的執(zhí)行邏輯;

8. 生成動態(tài)代理類的方法有4種:JDK自帶的動態(tài)代理、CGLIB、javassist、ASM庫;

9. JDK自帶的動態(tài)代理使用簡單,但功能較弱;

10. CGLIB和javassist是高級的字節(jié)碼生成庫,性能比JDK自帶的好,且功能強大;

11. ASM庫低級的字節(jié)碼生成工具,對開發(fā)人員要求較高,性能沒有量級的提升,可維護性差,只在性能要求苛刻的地方使用;

12. JDK的動態(tài)代理實現(xiàn):實現(xiàn)InvocationHandler接口,通過PRoxy.newProxyInstance方法創(chuàng)建代理;

13. CGLIB的實現(xiàn)(javassist類似):實現(xiàn)MethodInterceptor接口,new Enhancer-->setCallback-->setInterfaces-->create;

14. javassist有兩種方式創(chuàng)建:1、使用代理工廠;2、通過使用動態(tài)代碼創(chuàng)建;

15. javassist代理工廠方式實現(xiàn):實現(xiàn)MethodInterceptor接口,new ProxyFactory-->setInterfaces-->createClass-->newInstance;

16. javassist使用動態(tài)代碼方式創(chuàng)建,相當靈活,甚至可以在運行時生成業(yè)務邏輯;

17. javassist動態(tài)代碼方式實現(xiàn):ClassPool,CtClass;

clip_image037

clip_image039

clip_image041

clip_image043

clip_image045

clip_image047

clip_image049

clip_image051

jdk的動態(tài)代理實現(xiàn):

clip_image053

clip_image055

clip_image057

CGLIB的實現(xiàn):

clip_image059

clip_image061

javassist的代理工廠實現(xiàn):

clip_image063

clip_image065

javassist動態(tài)java代碼方式實現(xiàn):

clip_image067

clip_image069

幾種實現(xiàn)方式性能測試:

clip_image071

clip_image073

clip_image075

clip_image077

2.1.3 亨元模式 37 (8)

1. 亨元模式以提高系統(tǒng)性能為目的,核心思想是如果一個系統(tǒng)中存在多個相同的對象,那么只需共享一份對象的拷貝,而不必每次都創(chuàng)建新的對象。

2. 亨元模式對性能提升的主要幫助有兩點:(1)、可以節(jié)省重復創(chuàng)建對象的開銷,(2)、由于創(chuàng)建對象的數量減少,所以對內存的需求也減少,GC壓力降低;

3. 亨元模式的主要角色有4個:亨元工廠、抽象亨元、具體亨元類和主函數;

4. 一般情況下,亨元工廠會維護一個對象列表,如果請求的對象已經創(chuàng)建,則直接返回,如果沒有,則創(chuàng)建對象加入到維護隊列中;

5. 亨元模式的典型應用:SAAS系統(tǒng)(Software As A Service,目前比較流行的一種軟件應用模式);

6. 以一個人事管理系統(tǒng)的SAAS系統(tǒng)為例,公司甲、乙、丙都為這個SAAS系統(tǒng)的用戶,則3個亨元實例,就足以應付300個員工的查詢請求了;

7. 亨元模式和對象池的最大不同是亨元模式的對象都是不可以相互替代的,對象池的對象都是等價的,如數據庫連接池中的數據庫連接;

8. 報表實例;

clip_image079

clip_image081

clip_image083

clip_image085

clip_image087

clip_image089

實例:

clip_image091

clip_image093

clip_image095

clip_image097

clip_image099

clip_image101

clip_image103

2.1.4 裝飾者模式 40 (7)

1. 裝飾者模式可以動態(tài)添加對象功能;

2. 有一條重要的設計準則叫做合成/聚合復用原則:代碼復用應該盡可能使用委托,而不是使用繼承;因為繼承是一種緊密耦合,任何父類的改動都會影響其子類,不利于系統(tǒng)維護。而委托則是松散耦合,只要接口不變,委托類的改動并不會影響其上層對象;

3. 裝飾者模式通過委托機制,復用系統(tǒng)中的各個組件,在運行時,可以將這些功能組件進行疊加,從而構造一個“超級對象”,使其擁有所有這些組件的功能;

4. 裝飾者模式的好處:可以有效地分離性能組件和功能組件,從而提升模塊的可維護性并增加模塊的復用性;

5. 裝飾者模式的主要角色有4個:組件接口、具體組件、裝飾者、具體裝飾者;

6. 裝飾者的典型案例是對輸出結果進行增強,對輸出內容轉化為HTML,增加HTTP頭;

7. JDK中不少組件用裝飾者模式實現(xiàn),比如OutputStream和InputStream類族的實現(xiàn);

clip_image105

clip_image107

clip_image109

案例:

clip_image111

clip_image113

clip_image115

clip_image117

clip_image119

clip_image121

clip_image123

clip_image125

clip_image127

clip_image129

jdk中的不少組件用裝飾者模實現(xiàn);

clip_image131

clip_image133

clip_image135

clip_image137

clip_image139

clip_image141

clip_image143

2.1.5 觀察者模式 46 (5)

1. 當一個對象的行為依賴于另一個對象的狀態(tài)時,適用于觀察者模式,如果不用,則一般需要在另一個線程中不停監(jiān)聽對象所依賴的狀態(tài),增加系統(tǒng)的負擔;

2. 觀察者模式的意義在于:可以在單線程中,使某一個對象,及時得知自身所依賴的狀態(tài)變化。

3. 觀察者模式可以用于事件監(jiān)聽、通知發(fā)布等場合;

4. 觀察者模式的主要角色有4個:主題接口、具體主題、觀察者接口、具體觀察者;

5. JDK有一套觀察者模式的實現(xiàn),java.util.Observable類和java.util.Observer接口,

clip_image145

clip_image147

clip_image149

實例:

clip_image151

clip_image153

clip_image155

clip_image157

clip_image159

clip_image161

clip_image163

2.1.6 Value Object模式 50 (2)

1. 在J2EE軟件開發(fā)中,通常會對系統(tǒng)模塊進行分層;

2. Value Object模式提倡將一個對象的各個屬性進行封裝,將封裝后的對象在網絡中傳遞,從而擁有更好的交互模型,并且減少網絡通信數據,從而提高系統(tǒng)性能;

clip_image165

clip_image167

clip_image169

2.1.7 業(yè)務代理模式 53 (2)

1. 業(yè)務代理模式是將一組由遠程方法調用構成的業(yè)務流程,封裝在一個位于展示層的代理中;

2. 業(yè)務代理模式將一些業(yè)務流程封裝在前后臺系統(tǒng),為系統(tǒng)性能優(yōu)化提供了基礎平臺,在業(yè)務代理中,不僅可以復用業(yè)務流程,還可以視情況為展示層組件提供緩存等功能,從而減少遠程方法調用次數,降低系統(tǒng)壓力;

clip_image171

clip_image173

clip_image175

clip_image177

clip_image179

clip_image181

clip_image183

clip_image185

2.2 常用優(yōu)化組件和方法 56 (2)

1. 組件:緩沖和緩存;

2. 常用的5個優(yōu)化思想:池化對象、并行代替串行、負載均衡、時間換空間、空間換時間;

2.2.1 緩沖(Buffer) 56 (6)

1. 緩沖區(qū)是一塊特定的內存區(qū)域;

2. 開辟緩沖區(qū)的目的是緩解應用程序上下層之間的性能差異,提高系統(tǒng)的性能。

3. 日常生活中,緩沖區(qū)的一個典型應用是漏斗;

4. 緩沖可以協(xié)調上層組件和下層組件的性能差,當上層組件性能優(yōu)于下層組件時,可以有效較少上層組件對下層組件的等待時間;

5. 緩沖最常用的場景就是提高I/O的速度;

6. 案例:使用緩沖區(qū)提升動畫顯示效果(先在內存中畫圓,然后一次性顯示出來);

clip_image187

clip_image189

clip_image191

clip_image193

clip_image195

clip_image197

clip_image199

案例:使用緩沖區(qū)提升動畫顯示效果

clip_image201

clip_image203

clip_image205

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泗阳县| 万盛区| 大兴区| 油尖旺区| 三河市| 驻马店市| 临夏市| 包头市| 朔州市| 锡林郭勒盟| 伊金霍洛旗| 宁津县| 尤溪县| 通榆县| 巫溪县| 保德县| 庄河市| 德兴市| 中西区| 宜城市| 孙吴县| 吉木萨尔县| 凤翔县| 南涧| 兰考县| 垣曲县| 岑溪市| 平定县| 浦东新区| 称多县| 沽源县| 中方县| 罗甸县| 盖州市| 德化县| 温州市| 廉江市| 盈江县| 北宁市| 文登市| 张家口市|