Java性能調優概述
[TOC]算法
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優化、數據庫層面的優化、操做系統層面的優化等)
- 對性能優化要進行嚴格的測試
歡迎關注本站公眾號,獲取更多信息