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