wordpress linux centos 开源 Ubuntu 微软 php 程序员 Windows google mysql apache nginx Python java shell 编程 Firefox 云计算 Android

Java 程序性能優化《第一章》Java性能調優概述 1.2性能調優的層次

JAVA 程序性能優化《第一章》1.2性能調優的層次
為了提升系統性能,開發人員開始從系統各個角度和層次對系統進行優化。除了最常見的代碼優化外,在軟件架構上、JVM虛擬機層、數據庫以及操作系統層面都可以通過各種手段進行優化,從而在整體上提升系統的性能。

1.2.1 設計調優
設計調優處於所有調優手段的上層,它往往需要在軟件開發之前進行。在軟件開發之處,軟件架構師就應該評估系統可能存在的各種潛在問題,並給出合理的設計方案。由於軟件設計和架構對整體質量有決定性的影響,所以,設計調優對系統性能的影響也是最大的。如果說,代碼優化、JVM優化都是對系統微觀層面上 “ 量 ” 的優化,那麽設計優化就是對系統在宏觀層面上 “ 質 ” 的優化。
設計優化的一大顯著特點是,它可以規避某一個組件的性能問題,而非改良該組件的實現。比如,系統中組件A需要等待事件E才能觸發的行為。如果組件A通過循環監控不斷監測事件E是否發生,其監測行為必然會占用部分系統資源,因此,開發人員必須在監測頻率和資源消耗取得平衡。如果監測頻率太低,雖然減少的資源的消耗,但是系統實時反應性就會降低。如果進行代碼層的調優,就需要優化監測方法的實現以及求得一個最為恰當的頻率。
而若將次問題預留在設計層解決,便可以使用事件通知的方式將系統行為進行倒置。如使用第2章中提到的觀察者模式,在事件E發生的時刻,有事件E通知組件A,從而觸發組件A的行為。這種設計方法棄用了存在性能隱患的循環監控,從根本上解決了這一問題。
從某種角度上來說,設計優化直接決定了系統的整體品質。如果在設計層考慮不周到,留下太多問題隱患,那麽這些 “ 質 ” 上的問題,也許無法再通過代碼層的優化進行彌補。因此,開發人員必須在軟件設計之初,認真仔細考慮軟件系統的性能問題。
進行設計優化時,設計人員必須熟悉常用的軟件設計方法、設計模式、基本性能組件、和常用優化思想,並將其有機地集成在軟件系統中。

ps:一個良好的系統設計可以規避很多潛在的性能問題。因此盡可能的多花些時間在系統設計上,是創建高性能程序的關鍵。
1.2.2 代碼調化
代碼調優是在軟件開發過程中,或許在軟件開發完成後,軟件維護過程中進行的對程序代碼的改進和優化。代碼優化設計諸多編程技巧,需要開發人員熟悉相關語言的API,並在合適的場景中正確的使用相關API或類庫。同時,對算法、數據結構的靈活運用,也是代碼優化的重要內容。
雖然代碼優化是從微觀上對性能的進行調整,但是一個 “ 好 ” 的實現和一個 “ 壞 ” 的實現對系統的影響也是非常大的。比如,同樣作為List的實現,LinkedList 和 ArrayList 在隨機訪問上的性能卻可以相差幾個數量級;又如,同樣是文件讀寫的實現,使用 Stream 方式與 Java NIO 的方式,其性能可能又會相差一個數量級。
因此,雖然與設計優化相比,筆者將代碼優化稱為在微觀層面上的優化,但是它卻是對系統性能產生最直接影響的優化方法。

1.2.3 JVM 調優
由於Java 軟件總是運行在JVM虛擬機之上,對JVM虛擬機進行優化也能在一定程度上提升Java程序的性能。JVM調優通常可以在軟件開發後期進行,如在軟件開發完成,或者在軟件開發的某一個裏程碑階段。
作為Java 軟件的運行平臺,JVM的各項參數將會直接影響Java程序的性能。比如,JVM的堆大小、垃圾回收策略等。
要進行JVM層面調優,需要開發人員對JVM的運行原理和基本內存結構有一定了解。如,堆內存的結構、GC的種類等。然後依據應用程序的特點,設置合理的JVM啟動參數。

1.2.4 數據庫調優
對絕大多數應用系統而言,數據庫是必不可少的一部分。Java程序可以使用JDBC方式連接數據庫。對數據庫的調優可以分為3個部分:
在應用層對SQL語句進行優化。
對數據庫進行優化。
對數據庫軟件進行優化。
在應用層優化數據庫訪問,涉及大量的編程技巧。比如,當使用JDBC進行查詢時,對於大量的擁有相同結構的SQL查詢,可以使用PreparedStatement 代替 Statement ,以提高數據庫的查詢效率;在SELECT語句中,顯示指定要查詢的列名,避免使用星號 “ * ” 。
在對數據庫進行優化時,主要目的是建立一個具有良好表結構的數據庫。比如,為了提高多表級聯查詢效率,可以合理的使用冗余字段;對於大表,可以使用行的水平切割或者類似Oracle分區表的技術;為了提高數據庫查詢效率,可以建立有效且合理的索引。
對於數據庫軟件的優化,根據不同的數據庫,如 Oracle、mysql或者SQL Server 都擁有不同的方式。以Oracle 為例,設置合理大小的共享池、緩存緩沖區或者PGA,對Oracle的運行性能都有很大的影響。
鑒於本書的討論範圍,數據庫優化將不作為本書的闡述重點。

1.2.5 操作系統優化
作為軟件運行的基礎平臺,操作系統的性能對應用系統也有較大的影響。不同類型的操作系統,調優手段和參數可能會有所不同。比如,在主流的UNIX系統中,共享內存段、信號量、共享內存最大值(shmmax)、內存共享最小值(shmmin)等都是可以進行優化的系統資源。此外,如最大文件句柄數、虛擬內存大小、磁盤的塊大小等參數都可能對軟件的性能產生影響。圖1.5展示了在Windows平臺上,配置虛擬內存的界面。

延伸阅读

评论