Java 性能優化的五大技巧

要對你的 Java 代碼進行優化,須要理解 Java 不一樣要素之間的相互做用,以及它是如何與其運行時的操做系統進行交互的。使用下面這五個技巧和資源,開始學習如何分析和優化你的代碼吧。java

在咱們開始以前,你也許會擔憂正則表達式

許可的問題。Java 爲 Oracle 公司全部,遵循 Oracle 的 BCL 許可,該許可證不是一個免費/開源許可證。即使如此, 仍然有許多開源項目由 Oracle 公司的 Java 開發。 OpenJDK 是 Java 平臺自由軟件的實現,遵循 GPL v2 許可。(更多信息請參見維基百科 Free Java implementations。)算法

讓咱們開始吧

性能優化取決於多個因素,包括垃圾收集、虛擬機和底層操做系統(OS)設置。有多個工具可供開發人員進行分析和優化時使用,你能夠經過閱讀 Java Tools for Source Code Optimization and Analysis 來學習和使用它們。若是你正苦苦掙扎於術語和 Java 的原理,能夠先去查看 Livecoding Java category page,上面有直播,存檔的視頻,以及一些其餘有用的信息。數據庫

視狀況而定」

必需要明白的是,沒有兩個應用程序可使用相同的優化方式,也沒有完美的優化 java 應用程序的參考路徑。使用最佳實踐而且堅持採用適當的方式處理性能優化。想要達到真正最高的性能優化,你做爲一個 Java 開發人員,須要對 Java 虛擬機(JVM)和底層操做系統有正確的理解:性能優化

JVM 和底層操做系統:Java 虛擬機是任何 Java 程序的家。閱讀 JVM internals guide 瞭解更多有關於 JVM 內部和操做系統差別的內容。服務器

JVM 分佈模型:Java 分佈模型爲您的應用程序處理多個JVM實例。分佈模型提升了應用程序的性能,由於它得到更多的資源來工做。你能夠用兩種方法繼續優化。第一種方法是在一個堆大小爲2GB或8GB的單服務器運行多個 JVM。第二種方法是在多個服務器上運行單個 JVM。正確方法的選擇取決於多個因素,包括可用性和響應性。網絡

JVM 體系結構:選擇正確的 JVM 體系結構對於性能來講是很重要的。你能夠選擇 64 位或者 32 位的 JVM 機器。 通常來講,32 位 JVM 的性能比它對應的 64 位 JVM 要好。 只有當你須要的堆大小大於 3 GB 時,才選擇 64 位的 JVM。架構

清楚了性能優化和其要素,如今咱們能夠專一於那些能夠優化你的Java應用的技巧。併發

1. 調整垃圾收集(GC)

因爲垃圾收集的複雜性,很難發現你的應用的準確性能。不過,若是你真的想優化你的應用,你應該相應地處理垃圾收集。通用的準則是調整GC設置並同時執行性能分析。ide

一旦你對結果感到滿意,你能夠中止該過程並尋求其餘優化方式。確保除了在平均事務處理時間以外,你還留心了異常值。這些異常值是形成Java應用緩慢的真正的罪魁禍首而且很難找到。

此外,你要明白應用運行期間性能降低的效應。在每一個CPU時鐘內,緩慢的操做是能夠忽略的,但在每一個數據庫事務中的緩慢操做則是很是昂貴的消耗。可是你應該根據性能短板選擇你的優化策略,並根據工做負載來優化應用。

2. 正確地選擇適合你的GC算法

讓咱們更深刻地探討GC優化。畢竟,GC優化是要處理的整個優化問題中最基本的。目前,Java中有四種供你選擇的垃圾收集算法。每種算法知足不一樣的需求,所以你要選擇適合你的需求的。不少開發人員正是由於不瞭解GC算法而沒有優化他們的應用。

這四個算法分別是串行回收器,並行/吞吐量回收器,CMS回收器和G1回收器。想要了解更多關於每種垃圾收集器的信息及它們是如何工做的,請查看這篇來自Takipi博客的很是棒的文章Garbage Collectors—Serial vs. Parallel vs. CMS vs. G1。這篇文章同時還討論了Java8對GC算法的影響及其餘細節上的改變。

讓咱們再回到GC算法上,根據Understanding Java Garbage Collection這篇文章所述,併發標記和清除GC(即"CMS")算法纔是適合網絡服務端應用的最佳算法。並行GC算法則適合那些內部可預測的應用。

G1和CMS是併發操做的理想選擇,但仍然會引發應用頻繁停頓。實際的選擇取決於你如何取捨。舉例來講,儘管選擇並行算法會帶來更長的GC停頓時間,但相較於其餘GC算法,選擇並行算法還是一個好主意。

3.Java 堆

Java內存堆在迎合內存需求方面擔任了相當重要角色。一般更好的作法是,初始時分配最小的堆,而後經過持續的測試不斷增長它的大小。大多數時候優化問題均可以經過增長堆的大小解決,但若是存在大量的GC開銷,則該解決方案就不起做用。

GC開銷還會使吞吐量急劇降低,進而使得應用極其緩慢。此外,及早調整GC能夠幫助你避免堆大小分配的問題。開始的時候,你能夠選擇任何1GB到8GB的堆大小。當你選擇正確的堆大小,老生代和新生代對象的概念也就不須要了。

總而言之,堆大小應該取決於老生代和新生代對象的比率,以前的GC優化和對象集合(即全部對象佔用的內存大小)。

4. 關鍵應用優化

關鍵代碼優化是優化你的Java應用最好的方式。若是你的應用對GC和堆優化沒有反應,那麼最好是作架構改進並關注於你的應用是如何處理信息的。使用聰明的算法並管理好對象就能解決大量的問題,包括內存碎片、堆大小問題和垃圾收集的問題。

5.使用最優的函數

Java提供了多個函數來提高算法效率。若是你使用StringBuilder代替簡單的String,你能夠獲得微乎其微的性能提高。不過,咱們還有其餘方式在代碼層面進行優化。讓咱們看看下面這些優化方法。

使用StringBuilder代替+操做符。

避免使用iterator()。

多使用棧帶來的好處。

避免使用正則表達式,使用Apache Commons Lang做爲代替。

遠離遞歸。遞歸會佔用大量資源!

要想查看更多關於代碼優化的東西,請閱讀《十個最簡單的Java性能優化技巧》。

 

總結

Java的性能優化但是一個大課題,這片文章也只是拋磚引玉。若是您認爲文章還須要添加補充,別忘了在下面的評論中分享您的觀點。

原文:Dr. Michael J. Garbade

翻譯:KeYIKeYI,learner,惟恐有聞

譯文:http://coyee.com/article/11118-5-great-java-performance-optimization-tricks

原文:https://opensource.com/life/16/8/5-great-tricks-java-performance-optimization

 

 

更多資料可關注二維碼

相關文章
相關標籤/搜索