Java程式效能最佳化——效能調優層次

來源:互聯網
上載者:User

標籤:效能最佳化   效能   高效能   


       為了提升系統效能,開發人員可以從系統的各個角度和層次對系統進行最佳化。除了最常見的代碼最佳化外,在軟體架構上、JVM虛擬機器層、資料庫以及作業系統層都可以通過各種手段進行調優,從而在整體上提升系統的效能。

 

設計調優

       設計調優處於所有調優手段的上層,它往往需要在軟體開發之前進行。在軟體開發之初,軟體架構師就應該評估系統可能存在的各種潛在的問題,並給出合理的設計方案。由於軟體設計和架構對軟體整體有決定性的影響,所以,設計調優對系統效能的影響也是最大的。如果說,代碼最佳化、JVM最佳化都是對系統微觀層面上“量”的最佳化,那麼設計最佳化就是對系統在宏觀層面上“質”的最佳化。

設計最佳化的一大顯著特點是,它可以規避某一個組件的效能問題,而非改良該組件的實現。比如,系統中組件A需要等待某事件E才能出發一個行為。如果組件A通過迴圈監控不斷檢測事件E是否發生,其監測行為必然會佔用部分系統資源,因此,開發人員必須在監測頻率和資源消耗間擷取平衡。如果監測頻率太低,雖然減少了資源消耗,但是系統即時反應性就會降低。如果進行代碼層的調優,就需要最佳化監測方法的實現以及求得一個恰當的監測頻率。

而若將此問題預留在設計層解決,便可以使用事件通知的方式將系統行為進行倒置。如果使用觀察者設計模式,在事件E發生的時刻,由事件E通知群組件A,從而觸發組件A的行為。這種設計方法棄用了存在效能隱患的迴圈監控,從根本上解決了這個問題。

從某種程度上說,設計最佳化直接決定了系統的整體品質。如果在設計層考慮不周,留下太多問題隱患,那麼這些“質”上的問題,也許無法再通過代碼層的最佳化進行彌補。因此,開發人員必須在軟體設計之初,認真仔細考慮軟體系統的效能問題。

進行設計最佳化時,設計人員必須熟悉常用的軟體設計方法、設計模式、基本效能組件和常用最佳化思想,並將其有機地整合在軟體系統中。

註:一個良好的系統設計可以規避很多潛在的效能問題。因此,儘可能多花費時間在系統設計上,是建立高效能程式的關鍵。

 

代碼調優

       代碼調優是在軟體開發過程中,或者在軟體開發完成後,軟體維護過程中進行的對程式碼的改進與最佳化。代碼最佳化涉及諸多編碼技巧,需要開發人員熟悉相關語言的API,並在合適的情境中正確使用相關的API和類庫。同時,對演算法、資料結構的靈活使用,也是代碼最佳化的重要內容。

       雖然代碼最佳化時從微觀上對效能進行調整,但是一個“好”的實現和一個“壞”的實現對系統的影響也是非常大的。比如,同樣作為List的實現,LinkedList和ArrayList在隨機訪問上的效能卻可以相差幾個數量級;又如,同樣是檔案讀寫的實現,使用Stream方式與Java NIO的方式,其效能可能又會相差一個數量級。

       因此,雖然與設計最佳化相比,筆者將代碼最佳化稱為在微觀層面上的最佳化,但是它卻是對系統效能產生最直接影響的最佳化方法。

 

 JVM調優

       由於Java軟體總是運行在JVM虛擬機器之上,對JVM虛擬機器進行最佳化也能在一定程度上提升Java程式的效能。JVM調優通常可以在軟體開發後期進行,如在軟體開發完成,或者在軟體開發的某個裡程碑階段。

       作為Java軟體的運行平台,JVM的各項參數將會直接影響Java程式的效能。比如,JVM的堆大小、記憶體回收策略等。

       要進行JVM層面的調優,需要開發人員對JVM的運行原理和基本記憶體結構有一定瞭解。如,堆記憶體的結構,GC的種類等。然後,依據應用程式的特點,設定合理的JVM啟動參數。

 

資料庫調優

       對絕大部分應用系統而言,資料庫是必不可少的一部分。Java程式可以使用JDBC的方式串連資料庫。對資料庫的調優可以分為3個部分:

       □在應用程式層對SQL語句進行最佳化;

       □對資料庫進行最佳化;

       □對資料庫軟體進行最佳化。

       在應用程式層最佳化資料庫訪問,涉及大量的編程技巧。比如,當使用JDBC進行查詢操作時,對於大量的擁有相同結構的SQL查詢,可以使用PreparedStatement代替Statement,以提高資料庫的查詢效率;在Select語句中,顯示指定要查詢的列名,避免使用“*”。

       在對資料庫進行最佳化時,主要目的是建立一個具有良好表結構的資料庫。比如,為了提高多表級聯查詢效率,可以合理地使用冗餘欄位;對於大表,可以使用行的水平切割或者類似Oracle分區表的技術;為了提高資料庫查詢效率,可以建立有效且合理的索引。

       對於資料庫軟體的最佳化,根據不同的資料庫,如Oracle、MySQL或者SQL Server都擁有不同的方式。以Oracle為例,設定合理大小的共用池、緩衝緩衝區或者PGA,對Oracle的運行效能都有很大的影響。

 

作業系統調優

       作為軟體啟動並執行基礎平台,作業系統的效能對應用系統也有較大的影響。不同類型的作業系統,最佳化的手段和參數可能會有所不同。比如,在主流UNIX系統中,共用記憶體段、訊號量、共用記憶體最大值(shmmax)、共用內部才能最小值(shmmin)等都是可以進行最佳化的系統資源。此外,如最大檔案控制代碼數、虛擬記憶體大小、磁碟的塊大小等參數都可能對軟體的效能產生影響。

 

       存在效能問題的系統,十之八九是由某一個系統瓶頸導致的。只要找到該效能瓶頸,分析瓶頸的形成原因,對症下藥,使用合理的方法解決效能瓶頸,就能從根本上提升效能。所以,系統效能最佳化的最主要的就是尋找並解決效能瓶頸問題。但同時值得注意的是,效能最佳化往往會涉及對原來的實現進行較大的修改,因此,很難保證這些修改不會引入新的問題。所以,在效能最佳化前,需要對效能最佳化的目標、方法進行統籌的安排。

       對軟體系統進行最佳化,首先需要有明確的效能目標,清楚地指出最佳化的對象和最終目標。其次,需要在目標平台上對軟體進行測試,通過各種效能監控和統計工具,觀測和確認當前系統是否已經達到相關目標,若已經達到,則沒有必要再進行最佳化;若當前系統效能尚未達到最佳化目標,則需要尋找當前的效能瓶頸。


以上文字整理自:  [Java程式效能最佳化-.讓你的Java程式更快、更穩定].葛一鳴等編著

【轉載使用,請註明出處:http://blog.csdn.net/mahoking】


Java程式效能最佳化——效能調優層次

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.