Java效能調優概述
阿新 • • 發佈:2018-11-19
目錄
Java效能調優概述
效能優化有風險和弊端,效能調優必須有明確的目標,不要為了調優而調優!!!盲目調優,風險遠大於收益!!!
程式效能的主要表現點
- 執行速度:程式的反映是否迅速,響應時間是否足夠短
- 記憶體分配:記憶體分配是否合理,是否過多地消耗記憶體或者存在記憶體洩漏
- 啟動時間:程式從執行到可以正常處理業務需要花費多少時間
- 負載承受能力:當系統壓力上升時,系統的執行速度、響應時間的上升曲線是否平緩
衡量程式效能的主要指標:
- 執行時間:程式從執行到結束所使用的時間
- CPU時間:函式或者執行緒佔用CPU的時間
- 記憶體分配:程式在執行時佔用內容的空間
- 磁碟吞吐量:描述I/O的使用情況
- 網路吞吐量:描述網路的使用情況
- 響應時間:系統對使用者行為或者事件做出響應的時間,響應時間越短,效能越好
有可能成為系統性能瓶頸的幾個方面:
- 磁碟I/O:磁碟I/O讀寫的速度比內容慢很多,如果程式中需要等待磁碟I/O處理,低效的磁碟I/O操作會拖累整個系統
- 網路操作:由於網路環境的不確定性,導致網路資料讀寫的操作可能比本地磁碟I/O更慢,如果,網路操作處理不當,也回成為系統瓶頸
- CPU:對計算資源要求較高的應用,由於長時間、不間斷地大量佔用CPU資源,那麼對CPU的爭奪將導致系統性能問題
- 異常:Java中的異常捕獲和處理都是非常消耗資源的,如果程式碼中高頻率的異常處理,那麼程式碼的整體系統能就會明顯下降
- 資料庫:大量資料對資料庫的讀寫操作是相當費時的,而往往很多程式碼中需要等到資料庫操作完成之後才可以進行後續操作,這種緩慢的同步操作也將會成為系統瓶頸
- 鎖競爭:對於高併發的系統來講,鎖競爭是相當激烈的,這對效能是一個極大的打擊,鎖競爭會明顯增加執行緒上下文切換的開銷,而往往這些開銷都是與應用需求無關的系統開銷,白白佔用CPU資源,帶來不了任何好處
- 記憶體:一般情況,只要應用程式設計合理,記憶體在讀寫速度上不太可能成為效能瓶頸。除非程式中進行了高頻率的記憶體交換和掃描。記憶體成為系統瓶頸的最可能的情況就是記憶體大小不足。如果應用程式中將一些常用的核心資料存入記憶體,這個一定程度上會降低程式效能,因此,在將常用資料寫入記憶體的時候,要注意一些優化處理
效能調優的層次
- 設計調優:處於所有調優手段的上層,在軟體開發之前進行,軟體設計和架構對軟體整體質量有決定性的影響,所以,設計調優對系統性能的影響也是最大的。其他方面的優化都是對系統微觀層面上量的優化,而設計優化是對系統在巨集觀方面上質的優化。一個良好的系統設計可以規避很多潛在的效能問題,因此,儘可能多花時間在系統設計上,是建立高效能程式的關鍵
- 程式碼調優:發生在軟體開發的過程中、軟體開發完成後、軟體維護過程中,對程式碼進行改進和優化,要求開發員熟悉語言的API、在合適場景使用正確的API、對演算法和資料結構靈活運用
- JVM調優:需要對JVM執行原理和基本記憶體結構有一定了解,然後依據應用程式的特點,設定合理的JVM啟動引數
- 資料庫調優:主要包括在應用層對SQL語句進行優化,對資料庫進行優化(設計具有良好表結構的資料庫),對資料庫軟體進行優化(比如使用Oracle資料庫,需要設定合理大小的共享池、快取緩衝區等)
- 作業系統調優:不同型別的作業系統,調優的手段和引數可能會有所不同。在主流額UNIX系統中,共享記憶體段、訊號量、共享記憶體最大值、共享記憶體最小值等都是可以進行優化的系統資源
基本調優策略和手段
- 明確性能優化的目標,確定優化的物件和最終目的(首先定位到系統的效能瓶頸,確定相關程式碼進行程式碼優化,如已無程式碼優化空間,則要考慮其他方面的優化:JVM優化、資料庫層面的優化、作業系統層面的優化等)
- 對效能優化要進行嚴格的測試