java性能調(diào)優(yōu)的方法_第1頁(yè)
java性能調(diào)優(yōu)的方法_第2頁(yè)
java性能調(diào)優(yōu)的方法_第3頁(yè)
java性能調(diào)優(yōu)的方法_第4頁(yè)
java性能調(diào)優(yōu)的方法_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第頁(yè)共頁(yè)關(guān)于java性能調(diào)優(yōu)的方法關(guān)于java性能調(diào)優(yōu)的方法java性能調(diào)優(yōu)的方法程序性能的主要表現(xiàn)點(diǎn):執(zhí)行速度:程序的反映是否迅速,響應(yīng)時(shí)間是否足夠短內(nèi)存分配:內(nèi)存分配是否合理,是否過(guò)多地消耗內(nèi)存或者存在內(nèi)存泄漏啟動(dòng)時(shí)間:程序從運(yùn)行到可以正常處理業(yè)務(wù)需要花費(fèi)多少時(shí)間負(fù)載承受才能:當(dāng)系統(tǒng)壓力上升時(shí),系統(tǒng)的執(zhí)行速度、響應(yīng)時(shí)間的上升曲線是否平緩衡量程序性能的主要指標(biāo):執(zhí)行時(shí)間:程序從運(yùn)行到完畢所使用的時(shí)間CPU時(shí)間:函數(shù)或者線程占用CPU的時(shí)間內(nèi)存分配:程序在運(yùn)行時(shí)占用內(nèi)容的空間磁盤吞吐量:描繪I/O的使用情況網(wǎng)絡(luò)吞吐量:描繪網(wǎng)絡(luò)的使用情況響應(yīng)時(shí)間:系統(tǒng)對(duì)用戶行為或者事件做出響應(yīng)的時(shí)間,響應(yīng)時(shí)間越短,性能越好有可能成為系統(tǒng)性能瓶頸的幾個(gè)方面:磁盤I/O:磁盤I/O讀寫的速度比內(nèi)容慢很多,假設(shè)程序中需要等待磁盤I/O處理,低效的磁盤I/O操作會(huì)拖累整個(gè)系統(tǒng)網(wǎng)絡(luò)操作:由于網(wǎng)絡(luò)環(huán)境的不確定性,導(dǎo)致網(wǎng)絡(luò)數(shù)據(jù)讀寫的操作可能比本地磁盤I/O更慢,假設(shè),網(wǎng)絡(luò)操作處理不當(dāng),也回成為系統(tǒng)瓶頸CPU:對(duì)計(jì)算資要求較高的應(yīng)用,由于長(zhǎng)時(shí)間、不連續(xù)地大量占用CPU資,那么對(duì)CPU的爭(zhēng)奪將導(dǎo)致系統(tǒng)性能問(wèn)題異常:Java中的異常捕獲和處理都是非常消耗資的,假設(shè)代碼中高頻率的異常處理,那么代碼的整體系統(tǒng)能就會(huì)明顯下降數(shù)據(jù)庫(kù):大量數(shù)據(jù)對(duì)數(shù)據(jù)庫(kù)的讀寫操作是相當(dāng)費(fèi)時(shí)的,而往往很多代碼中需要等到數(shù)據(jù)庫(kù)操作完成之后才可以進(jìn)展后續(xù)操作,這種緩慢的同步操作也將會(huì)成為系統(tǒng)瓶頸鎖競(jìng)爭(zhēng):對(duì)于高并發(fā)的系統(tǒng)來(lái)講,鎖競(jìng)爭(zhēng)是相當(dāng)劇烈的,這對(duì)性能是一個(gè)極大的打擊,鎖競(jìng)爭(zhēng)會(huì)明顯增加線程上下文切換的開(kāi)銷,而往往這些開(kāi)銷都是與應(yīng)用需求無(wú)關(guān)的系統(tǒng)開(kāi)銷,白白占用CPU資,帶來(lái)不了任何好處內(nèi)存:一般情況,只要應(yīng)用程序設(shè)計(jì)合理,內(nèi)存在讀寫速度上不太可能成為性能瓶頸。除非程序中進(jìn)展了高頻率的內(nèi)存交換和掃描。內(nèi)存成為系統(tǒng)瓶頸的最可能的情況就是內(nèi)存大小缺乏。假設(shè)應(yīng)用程序中將一些常用的核心數(shù)據(jù)存入內(nèi)存,這個(gè)一定程度上會(huì)降低程序性能,因此,在將常用數(shù)據(jù)寫入內(nèi)存的時(shí)候,要注意一些優(yōu)化處理性能調(diào)優(yōu)的層次:設(shè)計(jì)調(diào)優(yōu):處于所有調(diào)優(yōu)手段的上層,在軟件開(kāi)發(fā)之前進(jìn)展,軟件設(shè)計(jì)和架構(gòu)對(duì)軟件整體質(zhì)量有決定性的影響,所以,設(shè)計(jì)調(diào)優(yōu)對(duì)系統(tǒng)性能的影響也是最大的。其他方面的優(yōu)化都是對(duì)系統(tǒng)微觀層面上量的優(yōu)化,而設(shè)計(jì)優(yōu)化是對(duì)系統(tǒng)在宏觀方面上質(zhì)的優(yōu)化。一個(gè)良好的系統(tǒng)設(shè)計(jì)可以躲避很多潛在的性能問(wèn)題,因此,盡可能多花時(shí)間在系統(tǒng)設(shè)計(jì)上,是創(chuàng)立高性能程序的關(guān)鍵代碼調(diào)優(yōu):發(fā)生在軟件開(kāi)發(fā)的過(guò)程中、軟件開(kāi)發(fā)完成后、軟件維護(hù)過(guò)程中,對(duì)代碼進(jìn)展改進(jìn)和優(yōu)化,要求開(kāi)發(fā)員熟悉語(yǔ)言的API、在適宜場(chǎng)景使用正確的API、對(duì)算法和數(shù)據(jù)構(gòu)造靈敏運(yùn)用JVM調(diào)優(yōu):需要對(duì)JVM運(yùn)行原理和根本內(nèi)存構(gòu)造有一定理解,然后根據(jù)應(yīng)用程序的特點(diǎn),設(shè)置合理的JVM啟動(dòng)參數(shù)數(shù)據(jù)庫(kù)調(diào)優(yōu):主要包括在應(yīng)用層對(duì)SQL語(yǔ)句進(jìn)展優(yōu)化,對(duì)數(shù)據(jù)庫(kù)進(jìn)展優(yōu)化(設(shè)計(jì)具有良好表構(gòu)造的數(shù)據(jù)庫(kù)),對(duì)數(shù)據(jù)庫(kù)軟件進(jìn)展優(yōu)化(比方使用Oracle數(shù)據(jù)庫(kù),需要設(shè)置合理大小的共享池、緩存緩沖區(qū)等)操作系統(tǒng)調(diào)優(yōu):不同類型的操作系統(tǒng),調(diào)優(yōu)的手段和參數(shù)可能會(huì)有所不同。在主流額UNIX系統(tǒng)中,共享內(nèi)存段、信號(hào)量、共享內(nèi)存最大值、共享內(nèi)存最小值等都是可以進(jìn)展優(yōu)化的系統(tǒng)資根本調(diào)優(yōu)策略和手段明確性能優(yōu)化的目的,確定優(yōu)化的`對(duì)象和最終目的(首先定位到系統(tǒng)的性能瓶頸,確定相關(guān)代碼進(jìn)展代碼優(yōu)化,如已無(wú)代碼優(yōu)化空間,那么要考慮其他方面的優(yōu)化:JVM優(yōu)化、數(shù)據(jù)庫(kù)層面的優(yōu)化、操作系統(tǒng)層面的優(yōu)化等)。Java性能優(yōu)化技巧大全1.盡量使用final修飾符。帶有final修飾符的類是不可派生的。在JAVA核心API中,有許多應(yīng)用final的例子,例如java.lang.String。為String類指定final防止了使用者覆蓋length方法。另外,假設(shè)一個(gè)類是final的,那么該類所有方法都是final的。java編譯器會(huì)尋找時(shí)機(jī)內(nèi)聯(lián)〔inline〕所有的final方法〔這和詳細(xì)的編譯器實(shí)現(xiàn)有關(guān)〕。此舉可以使性能平均進(jìn)步50%。2.盡量重用對(duì)象。特別是String對(duì)象的使用中,出現(xiàn)字符串連接情況時(shí)應(yīng)使用StringBuffer代替,由于系統(tǒng)不僅要花時(shí)間生成對(duì)象,以后可能還需要花時(shí)間對(duì)這些對(duì)象進(jìn)展垃圾回收和處理。因此生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響。3.盡量使用局部變量。調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)立的臨時(shí)變量都保存在?!睸tack〕中,速度較快。其他變量,如靜態(tài)變量,實(shí)例變量等,都在堆〔Heap〕中創(chuàng)立,速度較慢。4.不要重復(fù)初始化變量。默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時(shí),java會(huì)把變量初始化成確定的值,所有的對(duì)象被設(shè)置成null,整數(shù)變量設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。當(dāng)一個(gè)類從另一個(gè)類派生時(shí),這一點(diǎn)尤其應(yīng)該注意,因?yàn)橛胣ew關(guān)鍵字創(chuàng)立一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。這里有個(gè)注意,給成員變量設(shè)置初始值但需要調(diào)用其他方法的時(shí)候,最好放在一個(gè)方法比方initXXX中,因?yàn)橹苯诱{(diào)用某方法賦值可能會(huì)因?yàn)轭惿形闯跏蓟鴴伩罩羔槷惓?,publicintstate=this.getState;5.在java+Oracle的應(yīng)用系統(tǒng)開(kāi)發(fā)中,java中內(nèi)嵌的SQL語(yǔ)言應(yīng)盡量使用大寫形式,以減少Oracle解析器的解析負(fù)擔(dān)。6.java編程過(guò)程中,進(jìn)展數(shù)據(jù)庫(kù)連接,I/O流操作,在使用完畢后,及時(shí)關(guān)閉以釋放資。因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開(kāi)銷。7.過(guò)分的創(chuàng)立對(duì)象會(huì)消耗系統(tǒng)的大量?jī)?nèi)存,嚴(yán)重時(shí),會(huì)導(dǎo)致內(nèi)存泄漏,因此,保證過(guò)期的對(duì)象的及時(shí)回收具有重要意義。JVM的GC并非非常智能,因此建議在對(duì)象使用完畢后,手動(dòng)設(shè)置成null。8.在使用同步機(jī)制時(shí),應(yīng)盡量使用方法同步代替代碼塊同步。9.盡量減少對(duì)變量的重復(fù)計(jì)算。比方for(inti=0;i<list.size;i++)應(yīng)修改為for(inti=0,len=list.size;i<len;i++)10.采用在需要的時(shí)候才開(kāi)始創(chuàng)立的策略。例如:Stringstr=“abc”;if(i==1){list.add(str);}應(yīng)修改為:if(i==1){Stringstr=“abc”;list.add(str);}11.慎用異常,異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)立一個(gè)新的對(duì)象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace的本地方法,fillInStackTrace方法檢查棧,搜集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用棧,因?yàn)樵谔幚磉^(guò)程中創(chuàng)立了一個(gè)新的對(duì)象。異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。12.不要在循環(huán)中使用Try/Catch語(yǔ)句,應(yīng)把Try/Catch放在循環(huán)最外層。Error是獲取系統(tǒng)錯(cuò)誤的類,或者說(shuō)是虛擬機(jī)錯(cuò)誤的類。不是所有的錯(cuò)誤Exception都能獲取到的,虛擬機(jī)報(bào)錯(cuò)Exception就獲取不到,必須用Error獲取。13.通過(guò)StringBuffer的構(gòu)造函數(shù)來(lái)設(shè)定他的初始化容量,可以明顯提升性能。StringBuffer的默認(rèn)容量為16,當(dāng)StringBuffer的容量到達(dá)最大容量時(shí),她會(huì)將自身容量增加到當(dāng)前的2倍+2,也就是2*n+2。無(wú)論何時(shí),只要StringBuffer到達(dá)她的最大容量,她就不得不創(chuàng)立一個(gè)新的對(duì)象數(shù)組,然后復(fù)制舊的對(duì)象數(shù)組,這會(huì)浪費(fèi)很多時(shí)間。所以給StringBuffer設(shè)置一個(gè)合理的'初始化容量值,是很有必要的!14.合理使用java.util.Vector。Vector與StringBuffer類似,每次擴(kuò)展容量時(shí),所有現(xiàn)有元素都要賦值到新的存儲(chǔ)空間中。Vector的默認(rèn)存儲(chǔ)才能為10個(gè)元素,擴(kuò)容加倍。vector.add(index,obj)這個(gè)方法可以將元素obj插入到index位置,但index以及之后的元素依次都要向下挪動(dòng)一個(gè)位置〔將其索引加1〕。除非必要,否那么對(duì)性能不利。同樣規(guī)那么適用于remove(intindex)方法,移除此向量中指定位置的元素。將所有后續(xù)元素左移〔將其索引減1〕。返回此向量中移除的元素。所以刪除vector最后一個(gè)元素要比刪除第1個(gè)元素開(kāi)銷低很多。刪除所有元素最好用removeAllElements方法。假設(shè)要?jiǎng)h除vector里的一個(gè)元素可以使用vector.remove(obj);而不必自己檢索元素位置,再刪除,如intindex=indexOf〔obj〕;vector.remove(index);15.當(dāng)復(fù)制大量數(shù)據(jù)時(shí),使用System.arraycopy;16.代碼重構(gòu),增加代碼的可讀性。17.不用new關(guān)鍵字創(chuàng)立對(duì)象的實(shí)例。用new【【關(guān)鍵詞】:^p】:創(chuàng)立類的實(shí)例時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。但假設(shè)一個(gè)對(duì)象實(shí)現(xiàn)了Cloneable接口,我們可以調(diào)用她的clone方法。clone方法不會(huì)調(diào)用任何類構(gòu)造函數(shù)。下面是Factory形式的一個(gè)典型實(shí)現(xiàn)。publicstaticCreditgetNewCredit{returnnewCredit;}改進(jìn)后的代碼使用clone方法,privatestaticCreditBaseCredit=newCredit;publicstaticCreditgetNewCredit{return(Credit)BaseCredit.clone;}18.乘除法假設(shè)可以使用位移,應(yīng)盡量使用位移,但最好加上注釋,因?yàn)槲灰撇僮鞑恢庇^,難于理解。19.不要將數(shù)組聲明為:publicstaticfinal。20.HaspMap的遍歷。MapparaMap=newHashMap;for(Entryentry:paraMap.entrySet){StringappFieldDefId=entry.getKey;String[]values=entry.getValue;}利用散列值取出相應(yīng)的Entry做比較得到結(jié)果,獲得entry的值之后直接取key和value。21.array(數(shù)組)和ArrayList的使用。array數(shù)組效率最高,但容量固定,無(wú)法動(dòng)態(tài)改變,ArrayList容量可以動(dòng)態(tài)增長(zhǎng),但犧牲了效率。22.單線程應(yīng)盡量使用HashMap,ArrayList,除非必要,否那么不推薦使用HashTable,Vector,她們使用了同步機(jī)制,而降低了性能。23.StringBuffer,StringBuilder的區(qū)別在于:java.lang.StringBuffer線程平安的可變字符序列。一個(gè)類似于String的字符串緩沖區(qū),但不能修改。StringBuilder與該類相比,通常應(yīng)該優(yōu)先使用StringBuilder類,因?yàn)樗С炙幸粯拥牟僮?,但由于她不?zhí)行同步,所以速度更快。為了獲得更好的性能,在構(gòu)造StringBuffer或StringBuilder時(shí)應(yīng)盡量指定她的容量。當(dāng)然假設(shè)不超過(guò)16個(gè)字符時(shí)就不用了。一樣情況下,使用StringBuilder比使用StringBuffer僅能獲得10%~15%的性能提升,但卻要冒多線程不平安的風(fēng)險(xiǎn)。綜合考慮還是建議使用StringBuffer。24.盡量使用根本數(shù)據(jù)類型代替對(duì)象。25.用簡(jiǎn)單的數(shù)值計(jì)算代替復(fù)雜的函數(shù)計(jì)算,比方查表方式解決三角函數(shù)問(wèn)題。26.使用詳細(xì)類比使用接口效率高,但構(gòu)造彈性降低了,但現(xiàn)代IDE都可以解決這個(gè)問(wèn)題。27.考慮使用靜態(tài)方法假設(shè)你沒(méi)有必要去訪問(wèn)對(duì)象的外部,那么就使你的方法成為靜態(tài)方法。她會(huì)被更快地調(diào)用,因?yàn)樗恍枰粋€(gè)虛擬函數(shù)導(dǎo)向表。這同事也是一個(gè)很好的理論

溫馨提示

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

評(píng)論

0/150

提交評(píng)論