這篇文章主要為大家展示了“怎么制定Java性能調(diào)優(yōu)標(biāo)準(zhǔn)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么制定Java性能調(diào)優(yōu)標(biāo)準(zhǔn)”這篇文章吧。
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)如東,十年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575一款線上產(chǎn)品如果沒有經(jīng)過性能測試,那它就好比是一顆定時 什么時候開始介入調(diào)優(yōu)?
解決了為什么要做性能優(yōu)化的問題,那么新的問題就來了:如果需要對系統(tǒng)做一次全面的性能監(jiān)測和優(yōu)化,我們從什么時候開始介入性能調(diào)優(yōu)呢?是不是越早介入越好?
其實,在項目開發(fā)的初期,我們沒有必要過于在意性能優(yōu)化,這樣反而會讓我們疲于性能優(yōu)化,不僅不會給系統(tǒng)性能帶來提升,還會影響到開發(fā)進度,甚至獲得相反的效果,給系統(tǒng)帶來新的問題。
我們只需要在代碼層面保證有效的編碼,比如,減少磁盤 I/O 操作、降低競爭鎖的使用以及使用高效的算法等等。遇到比較復(fù)雜的業(yè)務(wù),我們可以充分利用設(shè)計模式來優(yōu)化業(yè)務(wù)代碼。例如,設(shè)計商品價格的時候,往往會有很多折扣活動、紅包活動,我們可以用裝飾模式去設(shè)計這個業(yè)務(wù)。
在系統(tǒng)編碼完成之后,我們就可以對系統(tǒng)進行性能測試了。這時候,產(chǎn)品經(jīng)理一般會提供線上預(yù)期數(shù)據(jù),我們在提供的參考平臺上進行壓測,通過性能分析、統(tǒng)計工具來統(tǒng)計各項性能指標(biāo),看是否在預(yù)期范圍之內(nèi)。
在項目成功上線后,我們還需要根據(jù)線上的實際情況,依照日志監(jiān)控以及性能統(tǒng)計日志,來觀測系統(tǒng)性能問題,一旦發(fā)現(xiàn)問題,就要對日志進行分析并及時修復(fù)問題。
上面我們講到了在項目研發(fā)的各個階段性能調(diào)優(yōu)是如何介入的,其中多次講到了性能指標(biāo),那么性能指標(biāo)到底有哪些呢?
在我們了解性能指標(biāo)之前,我們先來了解下哪些計算機資源會成為系統(tǒng)的性能瓶頸。
CPU:有的應(yīng)用需要大量計算,他們會長時間、不間斷地占用 CPU 資源,導(dǎo)致其他資源無法爭奪到 CPU 而響應(yīng)緩慢,從而帶來系統(tǒng)性能問題。例如,代碼遞歸導(dǎo)致的無限循環(huán),正則表達式引起的回溯,JVM 頻繁的 FULL GC,以及多線程編程造成的大量上下文切換等,這些都有可能導(dǎo)致 CPU 資源繁忙。
內(nèi)存:Java 程序一般通過 JVM 對內(nèi)存進行分配管理,主要是用 JVM 中的堆內(nèi)存來存儲 Java 創(chuàng)建的對象。系統(tǒng)堆內(nèi)存的讀寫速度非???,所以基本不存在讀寫性能瓶頸。但是由于內(nèi)存成本要比磁盤高,相比磁盤,內(nèi)存的存儲空間又非常有限。所以當(dāng)內(nèi)存空間被占滿,對象無法回收時,就會導(dǎo)致內(nèi)存溢出、內(nèi)存泄露等問題。
磁盤 I/O:磁盤相比內(nèi)存來說,存儲空間要大很多,但磁盤 I/O 讀寫的速度要比內(nèi)存慢,雖然目前引入的 SSD 固態(tài)硬盤已經(jīng)有所優(yōu)化,但仍然無法與內(nèi)存的讀寫速度相提并論。網(wǎng)絡(luò):網(wǎng)絡(luò)對于系統(tǒng)性能來說,也起著至關(guān)重要的作用。如果你購買過云服務(wù),一定經(jīng)歷過,選擇網(wǎng)絡(luò)帶寬大小這一環(huán)節(jié)。帶寬過低的話,對于傳輸數(shù)據(jù)比較大,或者是并發(fā)量比較大的系統(tǒng),網(wǎng)絡(luò)就很容易成為性能瓶頸。
異常:Java 應(yīng)用中,拋出異常需要構(gòu)建異常棧,對異常進行捕獲和處理,這個過程非常消耗系統(tǒng)性能。如果在高并發(fā)的情況下引發(fā)異常,持續(xù)地進行異常處理,那么系統(tǒng)的性能就會明顯地受到影響。
數(shù)據(jù)庫:大部分系統(tǒng)都會用到數(shù)據(jù)庫,而數(shù)據(jù)庫的操作往往是涉及到磁盤 I/O 的讀寫。大量的數(shù)據(jù)庫讀寫操作,會導(dǎo)致磁盤 I/O 性能瓶頸,進而導(dǎo)致數(shù)據(jù)庫操作的延遲性。對于有大量數(shù)據(jù)庫讀寫操作的系統(tǒng)來說,數(shù)據(jù)庫的性能優(yōu)化是整個系統(tǒng)的核心。
鎖競爭:在并發(fā)編程中,我們經(jīng)常會需要多個線程,共享讀寫操作同一個資源,這個時候為了保持?jǐn)?shù)據(jù)的原子性(即保證這個共享資源在一個線程寫的時候,不被另一個線程修改),我們就會用到鎖。鎖的使用可能會帶來上下文切換,從而給系統(tǒng)帶來性能開銷。JDK1.6 之后,Java 為了降低鎖競爭帶來的上下文切換,對 JVM 內(nèi)部鎖已經(jīng)做了多次優(yōu)化,例如,新增了偏向鎖、自旋鎖、輕量級鎖、鎖粗化、鎖消除等。而如何合理地使用鎖資源,優(yōu)化鎖資源,就需要你了解更多的操作系統(tǒng)知識、Java 多線程編程基礎(chǔ),積累項目經(jīng)驗,并結(jié)合實際場景去處理相關(guān)問題。
了解了上面這些基本內(nèi)容,我們可以得到下面幾個指標(biāo),來衡量一般系統(tǒng)的性能。
1、響應(yīng)時間
響應(yīng)時間是衡量系統(tǒng)性能的重要指標(biāo)之一,響應(yīng)時間越短,性能越好,一般一個接口的響應(yīng)時間是在毫秒級。在系統(tǒng)中,我們可以把響應(yīng)時間自下而上細(xì)分為以下幾種:
數(shù)據(jù)庫響應(yīng)時間:數(shù)據(jù)庫操作所消耗的時間,往往是整個請求鏈中最耗時的;
服務(wù)端響應(yīng)時間:服務(wù)端包括 Nginx 分發(fā)的請求所消耗的時間以及服務(wù)端程序執(zhí)行所消耗的時間;
網(wǎng)絡(luò)響應(yīng)時間:這是網(wǎng)絡(luò)傳輸時,網(wǎng)絡(luò)硬件需要對傳輸?shù)恼埱筮M行解析等操作所消耗的時間;
客戶端響應(yīng)時間:對于普通的 Web、App 客戶端來說,消耗時間是可以忽略不計的,但如果你的客戶端嵌入了大量的邏輯處理,消耗的時間就有可能變長,從而成為系統(tǒng)的瓶頸。
2、吞吐量
在測試中,我們往往會比較注重系統(tǒng)接口的 TPS(每秒事務(wù)處理量),因為 TPS 體現(xiàn)了接口的性能,TPS 越大,性能越好。在系統(tǒng)中,我們也可以把吞吐量自下而上地分為兩種:磁盤吞吐量和網(wǎng)絡(luò)吞吐量。我們先來看磁盤吞吐量,磁盤性能有兩個關(guān)鍵衡量指標(biāo)。
接下來看網(wǎng)絡(luò)吞吐量,這個是指網(wǎng)絡(luò)傳輸時沒有幀丟失的情況下,設(shè)備能夠接受的大數(shù)據(jù)速率。網(wǎng)絡(luò)吞吐量不僅僅跟帶寬有關(guān)系,還跟 CPU 的處理能力、網(wǎng)卡、防火墻、外部接口以及 I/O 等等緊密關(guān)聯(lián)。而吞吐量的大小主要由網(wǎng)卡的處理能力、內(nèi)部程序算法以及帶寬大小決定。
3、計算機資源分配使用率
通常由 CPU 占用率、內(nèi)存使用率、磁盤 I/O、網(wǎng)絡(luò) I/O 來表示資源使用率。這幾個參數(shù)好比一個木桶,如果其中任何一塊木板出現(xiàn)短板,任何一項分配不合理,對整個系統(tǒng)性能的影響都是毀滅性的。
4、負(fù)載承受能力
當(dāng)系統(tǒng)壓力上升時,你可以觀察,系統(tǒng)響應(yīng)時間的上升曲線是否平緩。這項指標(biāo)能直觀地反饋給你,系統(tǒng)所能承受的負(fù)載壓力極限。例如,當(dāng)你對系統(tǒng)進行壓測時,系統(tǒng)的響應(yīng)時間會隨著系統(tǒng)并發(fā)數(shù)的增加而延長,直到系統(tǒng)無法處理這么多請求,拋出大量錯誤時,就到了極限。
以上是“怎么制定Java性能調(diào)優(yōu)標(biāo)準(zhǔn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!