JAVA效能優化的五種方式
一,JAVA效能優化之設計優化
設計優化處於效能優化手段的上層,它往往需要在軟體開發之前進行,在軟體開發之前,系統架構師應該就評估系統可能存在的各種潛在問題和技術難點,並給出合理的設計方案,由於軟體設計和系統架構對軟體整體設計質量有決定性的影響,所以,設計調優對系統的效能影響也是最大的,如果說,程式碼優化,JVM優化都是對系統微觀層次的“量”的優化,那設計優化就是對系統”質”的優化.
設計優化的一大顯著特徵是:它可以規避某一個元件的效能問題,而是改良元件的實現;比如:元件A通過迴圈監控不斷的檢測時間E是否發生,其檢測行為必然會佔用部分系統資源,因此,開發人員必須檢測頻率和資源消耗上取得平衡,如果檢測頻率太低,雖然減少了資源消耗,但是系統實時反應性就會降低,如果進行程式碼層的調優,就需要優化檢測方法的實現及要求得一個最為恰當的檢測頻率.對於這個問題我們就可以用設計模式中的觀察者模式 ,當事件E發生的時刻,由事件E通知元件A,從而觸發元件A的行為.這種設計從根本上解決了存在效能隱患的迴圈監控,從根本上解決了這一問題.
進行設計優化時,設計人員和必須熟悉常用的設計方法,設計模式,以及基本的效能元件和常用的優化思想,並將其有機地整合在軟體系統中.
注意:一個良好的系統設計可以規避很多潛在在的效能問題.因此,儘可能多花些時間在系統設計上,是建立高效能程式的關鍵
二,JAVA效能優化之程式碼優化
程式碼調優是在軟體開發中,或者是軟體開發完成後,軟體維護過程中進行的程式程式碼的改進和優化.程式碼優化涉及諸多編碼技巧,需要開發人員熟悉相關的語言API ,並在適合的場景中正確的使用相關API或類庫.同時,對演算法,資料結構的靈活使用,也是程式碼優化的一個重要內容.
雖然程式碼優化時從微觀上對效能進行調整,但是一個”好”的實現和一個”壞”的實現對系統的影響也是非常大的.比如,同樣作為List的實現,LinkedList和ArrayList在隨機訪問上的效能卻差了好幾個量級;比如同樣是檔案讀寫的實現,使用Stream方式和使用JAVA NIO的方式,其系能可能又會是另一個數量級.
因此,雖然與設計優化相比,筆者將程式碼優化成為在微觀層面上的優化,但它卻是對系統性能產生最直接影響的優化方法.
三,JVM優化
由於JAVA軟體總是執行在JVM虛擬機器之上,對JVM虛擬機器進行優化也能一定程度上的提升JAVA程式的效能。JVM通常可以在軟體開發後期進行,如在開發完成或者是軟體開發的某一里程碑階段。
作為JAVA軟體的執行平臺,JVM的各項引數將會直接影響JAVA程式的效能。比如,JVM的堆大小,垃圾回收策略等等。
要進行JVM層面的調優,需要開發人員對JVM的執行原理和基本記憶體結構有一定的瞭解。如,堆記憶體的結構,GC的種類等。然後,依據引用程式的特點,設定合理的JVM啟動引數。
四,資料庫優化
對絕大部分應用系統而言,資料庫是必不可少的一部分。JAVA程式可以使用JDBC的方式連線資料庫。對資料庫的調優可以分為三個部分:
- 在應用層對SQL語句進行優化;
- 對資料庫進行優化。
- 對資料庫軟體進行優化。
在應用層優化資料庫訪問,涉及大量的程式設計技巧。比如,當使用JDBC進行查詢的時候,對於大量擁有相同結構的SQL查詢,可以使用PerparedStatement代替Statement,以提高資料庫的查詢效率;在使用Select語句中,顯示指定要查詢的列名 ,避免使用*
在對資料庫優化時,主要目的是建立一個具有良好表結構的資料庫。比如,為了提高多表級聯查詢的效率,可以合理地使用冗餘欄位;對於大表,可以使用行的水平切割或者類似Oracle分割槽的技術;為了提高資料的查詢的效率,可以建立有效水平切割或者類似Oracle分割槽表的技術;為了提高資料庫查詢效率;在select語句中,顯示指定要查詢的列名,避免使用*。
在對資料庫進行優化時,主要目的是建立一個具有良好表結構的資料庫。比如,為了提高多表級聯查詢效率,可以合理地使用冗餘欄位;對於大表,可以使用行資料來水平切割,為了提高資料庫的查詢效率,可以建立有效且事宜的索引
五,JAVA效能優化之作業系統優化
作業系統,調優的手段和引數可能有所不同,比如,在主流Unix系統中,共享記憶體段,訊號量,共享記憶體最大值(shmmax),共享記憶體最小值(shmmin)等都是可以進行優化的系統資源.此外,如最大檔案控制代碼數,虛擬記憶體大小,磁碟的塊大小等引數都可能對軟體的效能產生影響.配置虛擬記憶體介面