天天看點

Java程式性能優化讀書筆記(一):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優化、資料庫層面的優化、作業系統層面的優化等)
  • 對性能優化要進行嚴格的測試

總結

  • 性能優化有風險和弊端,性能調優必須有明确的目标,不要為了調優而調優!!!盲目調優,風險遠大于收益!!!

轉載于:https://www.cnblogs.com/iamjiuye/p/6365074.html