如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用.ppt_第1頁
如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用.ppt_第2頁
如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用.ppt_第3頁
如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用.ppt_第4頁
如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用.ppt_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、如何用Java進行高性能網(wǎng)站開發(fā),Java程序性能優(yōu)化技巧,生成對象時,合理分配空間和大小: Java中的很多類都有它的默認的空間分配大小,對于一些有大小的對象的初始化,應(yīng)該預計對象的大小,然后使用進行初始化。例如:我們在使用Vector,當聲明Vector vectnew Vector()時,系統(tǒng)調(diào)用:public Vector() / 缺省構(gòu)造函數(shù)this(10); / 容量是 10;缺省分配10個對象大小容量。當執(zhí)行add方法時,可以看到具體實現(xiàn)為:.public synchronized boolean add(Object o) modCount+;ensureCapacityHel

2、per(elementCount+1);elementDataelementCount+ =o;return true;,Java程序性能優(yōu)化技巧,生成對象時,合理分配空間和大?。?private void ensureCapacityHelper(int minCapacity) int oldCapacity = elementData.length;if (minCapacity oldCapacity) Object oldData = elementData;int newCapacity = (capacityIncrement 0) ? (oldCapacity + capaci

3、tyIncrement) :(oldCapacity * 2);if (newCapacity minCapacity) newCapacity = minCapacity;elementData = new ObjectnewCapacity;System.arraycopy(oldData, 0, elementData, 0, elementCount);我們可以看到,當Vector大小超過原來的大小時,一些代碼的目的就是為了做容量的擴充,在預先知道該Vector大小的話,可以指定其大小,避免容量擴充的開銷。,Java程序性能優(yōu)化技巧,優(yōu)化循環(huán)體: 循環(huán)是比較重復運行的地方,如果循環(huán)次數(shù)

4、很大,循環(huán)體內(nèi)不好的代碼對效率的影響就會被放大而變的突出。讓我們看看下面的代碼片:.Vector vect = new Vector(1000);.for( inti=0; ivect.size(); i+).for循環(huán)部分改寫成:int size = vect.size();for( int i=0; isize; i+).如果size=1000,就可以減少1000次size()的系統(tǒng)調(diào)用開銷,避免了循環(huán)體重復調(diào)用。,Java程序性能優(yōu)化技巧,優(yōu)化循環(huán)體: 再看如下的代碼片:.for (int i = 0;i 100000;i+)if (i%10 = 9) . / 每十次執(zhí)行一次改寫成也可以

5、提高效率:.for(inti =0,j =10; i100000; i+,j-)if(j = 0). / 每十次執(zhí)行一次j = 10;所以,當有較大的循環(huán)時,應(yīng)該檢查循環(huán)內(nèi)是否有效率不高的地方,尋找更優(yōu)的方案加以改進。,Java程序性能優(yōu)化技巧,少用new初始化一個實例: 盡量少用new來初始化一個類的實例,當一個對象是用new進行初始化時,其構(gòu)造函數(shù)鏈的所有構(gòu)造函數(shù)都被調(diào)用到,所以new操作符是很消耗系統(tǒng)資源的,new一個對象耗時往往是局部變量賦值耗時的上千倍。同時,當生成對象后,系統(tǒng)還要花時間進行垃圾回收和處理。當new創(chuàng)建對象不可避免時,注意避免多次的使用new初始化一個對象。盡量在使用

6、時再創(chuàng)建該對象。如:NewObject object = new NewObject();int value;if(i0 )value =object.getValue();,Java程序性能優(yōu)化技巧,少用new初始化一個實例: 上面一段代碼可以修改為:int value;if(i0 )NewObject object = new NewObject();Value =object.getValue();另外,應(yīng)該盡量重復使用一個對象,而不是聲明新的同類對象。一個重用對象的方法是改變對象的值,如可以通過setValue之類的方法改變對象的變量達到重用的目的。,Java程序性能優(yōu)化技巧,選擇合適

7、的方法調(diào)用: 在Java中,一切都是對象,如果有方法(Method)調(diào)用,處理器先要檢查該方法是屬于哪個對象,該對象是否有效,對象屬于什么類型,然后選擇合適的方法并調(diào)用??梢詼p少方法的調(diào)用,同樣一個方法:public void CallMethod(int i )if( i =0 )return;. / 其他處理如果直接調(diào)用,int i = 0;.CallMethod(i);,Java程序性能優(yōu)化技巧,選擇合適的方法調(diào)用: 上面的代碼,就應(yīng)該寫成:int i = 0;.if( i =0 )CallMethod(i);不影響可讀性等情況下,可以把幾個小的方法合成一個大的方法。另外,在方法前加上f

8、inal,private關(guān)鍵字有利于編譯器的優(yōu)化。,Java程序性能優(yōu)化技巧,異常處理技巧: 異常是Java的一種錯誤處理機制,對程序來說是非常有用的,但是異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象,并進行相關(guān)的處理,造成系統(tǒng)的開銷,所以異常應(yīng)該用在錯誤處理的情況,不應(yīng)該用來控制程序流程,流程盡量用while,if等處理。在不是很影響代碼健壯性的前提下,可以把幾個try/catch塊合成一個。 盡量使用局部變量和靜態(tài)變量: 盡量使用局部變量,調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack) 中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度

9、較慢。盡量使用靜態(tài)變量,即加修飾符static,如果類中的變量不會隨他的實例而變化,就可以定義為靜態(tài)變量,從而使他所有的實例都共享這個變量。 同步處理技巧: 同步主要出現(xiàn)在多線程的情況,為多線程同時運行時提供對象數(shù)據(jù)安全的機制,多線程是比較復雜話題,應(yīng)用多線程也是為了獲得性能的提升,應(yīng)該盡可能減少同步。另外,如果需要同步的地方,可以減少同步的代碼段,如只同步某個方法或函數(shù),而不是整個代碼。,Java程序性能優(yōu)化技巧,盡可能的使用Java自身提供的API: Java的API一般都做了性能的考慮,如果完成相同的功能,優(yōu)先使用API而不是自己寫的代碼,如數(shù)組復制通常的代碼如下:int size =

10、1000;String strArray1 = new Stringsize;String strArray2 = new Stringsize;for(inti=0;isize;i+) / 賦值strArray1 = (new String(Array: + i);for(inti=0;isize;i+) / 復制strArray2=(new String(String)a);,Java程序性能優(yōu)化技巧,盡可能的使用Java自身提供的API: 上面那段代碼,如果使用Java提供的API,就可以提高性能:int size = 1000;String strArray1 = new String

11、size;String strArray2 = new Stringsize;for(inti=0;isize;i+) / 賦值strArray1 = (new String(Array: + i);System.arraycopy(strArray1,0,strArray2,0,size); / 復制同樣的一個規(guī)則是,當有大量數(shù)據(jù)的復制時,應(yīng)該使用System.arraycopy()。,Java程序性能優(yōu)化技巧,盡量減少I/O操作: 輸入/輸出(I/O)包括很多方面,我們知道,進行I/O操作是很消耗系統(tǒng)資源的。程序中應(yīng)該盡量少用I/O操作。使用時可以注意: . 合理控制輸出函數(shù)System.

12、out.println()對于大多時候是有用的,特別是系統(tǒng)調(diào)試的時候,但也會產(chǎn)生大量的信息出現(xiàn)在控制臺和日志上,同時輸出時,有序列化和同步的過程,造成了開銷。特別是在發(fā)行版中,要合理的控制輸出,可以在項目開發(fā)時,設(shè)計好一個Debug的工具類,在該類中可以實現(xiàn)輸出開關(guān),輸出的級別,根據(jù)不同的情況進行不同的輸出的控制。 盡量使用緩存: 讀寫內(nèi)存要比讀寫硬盤上的文件要快很多,應(yīng)盡可能使用緩沖,以便直接從內(nèi)存中讀取數(shù)據(jù)。盡可能使用帶有Buffer的類代替沒有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來進行處理I/O操作。同樣

13、可以用BufferedInputStream代替InputStream都可以獲得性能的提高,Java程序性能優(yōu)化技巧,盡量不使用同步: Servlet是多線程的,以處理不同的請求,基于前面同步的分析,如果有太多的同步就失去了多線程的優(yōu)勢了。 不用保存太多的信息在HttpSession中很多時候,存儲一些對象在HttpSession中是有必要的,可以加快系統(tǒng)的開發(fā),如網(wǎng)上商店系統(tǒng)會把購物車信息保存在該用戶的Session中,但當存儲大量的信息或是大的對象在會話中時,是有害的,特別是當系統(tǒng)中用戶的訪問量很大,對內(nèi)存的需求就會很高。具體開發(fā)時,在這兩者之間應(yīng)作好權(quán)衡。,Java程序性能優(yōu)化技巧,清除

14、SESSION: 通常情況,當達到設(shè)定的超時時間時,同時有些Session沒有了活動,服務(wù)器會釋放這些沒有活動的Session,. 不過這種情況下,特別是多用戶并訪時,系統(tǒng)內(nèi)存要維護多個的無效Session。當用戶退出時,應(yīng)該手動釋放,回收資源,實現(xiàn)如下:.HttpSession theSession = request.getSession();/ 獲取當前Sessionif(theSession != null)theSession.invalidate(); / 使該Session失效。 緩存Home接口: EJB庫使用Enterprise Bean 的客戶端通過它的Home接口創(chuàng)建它的

15、實例??蛻舳四芡ㄟ^JNDI訪問它。服務(wù)器通過Lookup方法來獲取。JNDI是個遠程對象,通過RMI方式調(diào)用,對它的訪問往往是比較費時的。所以,在設(shè)計時可以設(shè)計一個類專門用來緩存Home接口,在系統(tǒng)初始化時就獲得需要的Home接口并緩存,以后的引用只要引用緩存即可。,Java程序性能優(yōu)化技巧,使用快速度的Jdbc驅(qū)動: JDBC API包括兩種實現(xiàn)接口形式,一種是純Java實現(xiàn)的驅(qū)動,一種利用ODBC驅(qū)動和數(shù)據(jù)庫客戶端實現(xiàn),具體有四種驅(qū)動模式: 第一類:JDBC-ODBC橋,再加上ODBC驅(qū)動程序。第一類JDBC驅(qū)動程序是JDBC-ODBC橋再加上一個ODBC驅(qū)動程序。建議第一類驅(qū)動程序只用于

16、原型開發(fā),而不要用于正式的運行環(huán)境。橋接驅(qū)動程序由Sun提供,它的目標是支持傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)。Sun為該軟件提供關(guān)鍵問題的補丁,但不為該軟件的最終用戶提供支持。一般地,橋接驅(qū)動程序用于已經(jīng)在ODBC技術(shù)上投資的情形,例如已經(jīng)投資了Windows應(yīng)用服務(wù)器。盡管Sun提供了JDBC-ODBC橋接驅(qū)動程序,但由于ODBC會在客戶端裝載二進制代碼和數(shù)據(jù)庫客戶端代碼,這種技術(shù)不適用于高事務(wù)性的環(huán)境。另外,第一類JDBC驅(qū)動程序不支持完整的Java命令集,而是局限于ODBC驅(qū)動程序的功能,這種驅(qū)動方式也叫胖客戶,主要用于低并發(fā)請求,大數(shù)據(jù)量傳輸?shù)膽?yīng)用。,Java程序性能優(yōu)化技巧,使用快速度的Jdbc驅(qū)動

17、: 第二類:本機API,部分是Java的驅(qū)動程序。第二類JDBC驅(qū)動程序是本機API的部分Java代碼的驅(qū)動程序,用于把JDBC調(diào)用轉(zhuǎn)換成主流數(shù)據(jù)庫API的本機調(diào)用。這類驅(qū)動程序也存在與第一類驅(qū)動程序一樣的性能問題,即客戶端載入二進制代碼的問題,而且它們被綁定了特定的平臺。第二類驅(qū)動程序要求編寫面向特定平臺的代碼,主流的數(shù)據(jù)庫廠商,例如Oracle和IBM,都為它們的企業(yè)數(shù)據(jù)庫平臺提供了第二類驅(qū)動程序,使用這些驅(qū)動程序的開發(fā)者必須及時跟進不同數(shù)據(jù)庫廠商針對不同操作系統(tǒng)發(fā)行的各個驅(qū)動程序版本。另外,由于第二類驅(qū)動程序沒有使用純Java的API,把Java應(yīng)用連接到數(shù)據(jù)源時,往往必須執(zhí)行一些額外的

18、配置工作。很多時候,第二類驅(qū)動程序不能在體系結(jié)構(gòu)上與大型主機的數(shù)據(jù)源兼容;即使做到了兼容,效果也是比較差。,Java程序性能優(yōu)化技巧,使用快速度的Jdbc驅(qū)動: 第一類和第二類驅(qū)動的比較,Java程序性能優(yōu)化技巧,使用快速度的Jdbc驅(qū)動: 第三類:面向數(shù)據(jù)庫中間件的純Java驅(qū)動程序。第三類JDBC驅(qū)動程序是面向數(shù)據(jù)庫中間件的純Java驅(qū)動程序,JDBC調(diào)用被轉(zhuǎn)換成一種中間件廠商的協(xié)議,中間件再把這些調(diào)用轉(zhuǎn)換到數(shù)據(jù)庫API。第三類JDBC驅(qū)動程序的優(yōu)點是它以服務(wù)器為基礎(chǔ),也就是不再需要客戶端的本機代碼,這使第三類驅(qū)動程序要比第一、二兩類快。另外,開發(fā)者還可以利用單一的驅(qū)動程序連接到多種數(shù)據(jù)庫

19、。,Java程序性能優(yōu)化技巧,使用快速度的Jdbc驅(qū)動: 第四類:直接面向數(shù)據(jù)庫的純Java驅(qū)動程序。 第四類JDBC驅(qū)動程序是直接面向數(shù)據(jù)庫的純Java驅(qū)動程序,即所謂的“瘦”(thin)驅(qū)動程序,它把JDBC調(diào)用轉(zhuǎn)換成某種直接可被DBMS使用的網(wǎng)絡(luò)協(xié)議,這樣,客戶機和應(yīng)用服務(wù)器可以直接調(diào)用DBMS服務(wù)器。對于第四類驅(qū)動程序,不同DBMS的驅(qū)動程序不同。因此,在一個異構(gòu)計算環(huán)境中,驅(qū)動程序的數(shù)量可能會比較多。但是,由于第四類驅(qū)動程序具有較高的性能,能夠直接訪問DBMS,所以這一問題就不那么突出了, 這種驅(qū)動方式,主要用于高并發(fā),低數(shù)據(jù)量請求的應(yīng)用中。,Java程序性能優(yōu)化技巧,使用快速度的J

20、dbc驅(qū)動: 第三類和第四類驅(qū)動的比較,Java程序性能優(yōu)化技巧,使用Jdbc鏈接池 為了提高訪問數(shù)據(jù)庫的性能,我們還可以使用JDBC 2.0的一些規(guī)范和特性,JDBC是占用資源的,在使用數(shù)據(jù)庫連接時可以使用連接池Connection Pooling,避免頻繁打開、關(guān)閉Connection。而我們知道,獲取Connection是比較消耗系統(tǒng)資源的。Connection緩沖池:當一個應(yīng)用程序關(guān)閉一個數(shù)據(jù)庫連接時,這個連接并不真正釋放而是被循環(huán)利用,建立連接是消耗較大的操作,循環(huán)利用連接可以顯著的提高性能,因為可以減少新連接的建立。一個通過DataSource獲取緩沖池獲得連接,并連接到一個Cus

21、tomerDB數(shù)據(jù)源的代碼演示如下:Context ctx = new InitialContext();DataSource dataSource = (DataSource) ctx.lookup(jdbc/CustomerDB);Connection conn = dataSource.getConnection(password,username);,Java程序性能優(yōu)化技巧,緩存DataSorce 一個DataSource對象代表一個實際的數(shù)據(jù)源。這個數(shù)據(jù)源可以是從關(guān)系數(shù)據(jù)庫到表格形式的文件,完全依賴于它是怎樣實現(xiàn)的,一個數(shù)據(jù)源對象注冊到JNDI名字服務(wù)后,應(yīng)用程序就可以從JNDI服

22、務(wù)器上取得該對象,并使用之和數(shù)據(jù)源建立連接。通過上面的例子,我們知道DataSource是從連接池獲得連接的一種方式,通過JNDI方式獲得,是占用資源的。為了避免再次的JNDI調(diào)用,可以系統(tǒng)中緩存要使用的DataSource。即時關(guān)閉使用過的資源 互聯(lián)網(wǎng)應(yīng)用系統(tǒng)一般是并發(fā)的系統(tǒng),在每次申請和使用完資源后,應(yīng)該釋放供別人使用,使用完成后應(yīng)該保證徹底的釋放。,如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用,架構(gòu)選型 在網(wǎng)站W(wǎng)eb應(yīng)用開發(fā)中,系統(tǒng)的整體架構(gòu)是決定網(wǎng)站性能、穩(wěn)定性、并發(fā)、可擴展性的關(guān)鍵因素。下面以世界著名網(wǎng)站應(yīng)用軟件提供商CoreMediaCMS系統(tǒng)為例,進行架構(gòu)分析,如何利用Java開

23、發(fā)高性能、高并發(fā)Web應(yīng)用,架構(gòu)選型 CoreMediaCMS將整個應(yīng)用分成四成架構(gòu),每一層都可以獨立于其他層而正常運行,每一層都可以分布式布署,極大的提高了應(yīng)用系統(tǒng)的穩(wěn)定性、可擴展性、支持高并發(fā)的要求,每一次之前通過中間件Corba進行穩(wěn)定的傳輸數(shù)據(jù)。,如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用,開發(fā)框架的選型 充分利用開源框架,可以大大提高開發(fā)效率。很多初級開發(fā)者,都采用DB+JavaBean+JSP這種初級的開發(fā)模式,而現(xiàn)在主要使用Struts、Spring等MVC開發(fā)框架。 常用開發(fā)框架構(gòu)選型有: Struts、Spring、Webwork等。 天極傳媒選擇的開發(fā)框架是:Struts+Spring+iBatis,在這個開發(fā)框架里,充分利用了Struts、Spring各自己的優(yōu)點,可以選擇StutsMVC,也可以選擇Spring MVC。,如何利用Java開發(fā)高性能、高并發(fā)Web應(yīng)用,分級存儲 )數(shù)據(jù)庫數(shù)據(jù)分級存儲: 將經(jīng)常訪問的數(shù)據(jù)和訪問頻度低的數(shù)據(jù),分別存放到不同的分區(qū),甚至存放到不同的數(shù)據(jù)庫服務(wù)器,以便合進分配硬盤I/O及系統(tǒng)I/O。 )網(wǎng)站內(nèi)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論