Java 性能優(yōu)化的五大技巧

要對你的 Java 代碼進(jìn)行優(yōu)化,需要理解 Java 不同要素之間的相互作用,以及它是如何與其運(yùn)行時(shí)的操作系統(tǒng)進(jìn)行交互的。使用下面這五個(gè)技巧和資源,開始學(xué)習(xí)如何分析和優(yōu)化你的代碼吧。

在我們開始之前,你也許會擔(dān)心許可的問題。Java 為 Oracle 公司所有,遵循 Oracle 的 BCL 許可,該許可證不是一個(gè)免費(fèi)/開源許可證。即便如此, 仍然有許多開源項(xiàng)目由 Oracle 公司的 Java 開發(fā)。 OpenJDK 是 Java 平臺自由軟件的實(shí)現(xiàn),遵循 GPL v2 許可。(更多信息請參見維基百科 Free Java implementations。)

讓我們開始吧

性能優(yōu)化取決于多個(gè)因素,包括垃圾收集、虛擬機(jī)和底層操作系統(tǒng)(OS)設(shè)置。有多個(gè)工具可供開發(fā)人員進(jìn)行分析和優(yōu)化時(shí)使用,你可以通過閱讀 Java Tools for Source Code Optimization and Analysis 來學(xué)習(xí)和使用它們。如果你正苦苦掙扎于術(shù)語和 Java 的原理,可以先去查看 Livecoding Java category page,上面有直播,存檔的視頻,以及一些其他有用的信息。

視情況而定”

必須要明白的是,沒有兩個(gè)應(yīng)用程序可以使用相同的優(yōu)化方式,也沒有完美的優(yōu)化 java 應(yīng)用程序的參考路徑。使用最佳實(shí)踐并且堅(jiān)持采用適當(dāng)?shù)姆绞教幚硇阅軆?yōu)化。想要達(dá)到真正最高的性能優(yōu)化,你作為一個(gè) Java 開發(fā)人員,需要對 Java 虛擬機(jī)(JVM)和底層操作系統(tǒng)有正確的理解:

JVM 和底層操作系統(tǒng):Java 虛擬機(jī)是任何 Java 程序的家。閱讀 JVM internals guide 了解更多有關(guān)于 JVM 內(nèi)部和操作系統(tǒng)差異的內(nèi)容。

JVM 分布模型:Java 分布模型為您的應(yīng)用程序處理多個(gè)JVM實(shí)例。分布模型提高了應(yīng)用程序的性能,因?yàn)樗@得更多的資源來工作。你可以用兩種方法繼續(xù)優(yōu)化。第一種方法是在一個(gè)堆大小為2GB或8GB的單服務(wù)器運(yùn)行多個(gè) JVM。第二種方法是在多個(gè)服務(wù)器上運(yùn)行單個(gè) JVM。正確方法的選擇取決于多個(gè)因素,包括可用性和響應(yīng)性。

JVM 體系結(jié)構(gòu):選擇正確的 JVM 體系結(jié)構(gòu)對于性能來說是很重要的。你可以選擇 64 位或者 32 位的 JVM 機(jī)器。 一般來說,32 位 JVM 的性能比它對應(yīng)的 64 位 JVM 要好。 只有當(dāng)你需要的堆大小大于 3 GB 時(shí),才選擇 64 位的 JVM。

清楚了性能優(yōu)化和其要素,現(xiàn)在我們可以專注于那些可以優(yōu)化你的Java應(yīng)用的技巧。

1. 調(diào)整垃圾收集(GC)

由于垃圾收集的復(fù)雜性,很難發(fā)現(xiàn)你的應(yīng)用的準(zhǔn)確性能。不過,如果你真的想優(yōu)化你的應(yīng)用,你應(yīng)該相應(yīng)地處理垃圾收集。通用的準(zhǔn)則是調(diào)整GC設(shè)置并同時(shí)執(zhí)行性能分析。

一旦你對結(jié)果感到滿意,你可以停止該過程并尋求其他優(yōu)化方式。確保除了在平均事務(wù)處理時(shí)間之外,你還留心了異常值。這些異常值是造成Java應(yīng)用緩慢的真正的罪魁禍?zhǔn)撞⑶液茈y找到。

此外,你要明白應(yīng)用運(yùn)行期間性能下降的效應(yīng)。在每個(gè)CPU時(shí)鐘內(nèi),緩慢的操作是可以忽略的,但在每個(gè)數(shù)據(jù)庫事務(wù)中的緩慢操作則是非常昂貴的消耗。但是你應(yīng)該根據(jù)性能短板選擇你的優(yōu)化策略,并根據(jù)工作負(fù)載來優(yōu)化應(yīng)用。

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

讓我們更深入地探討GC優(yōu)化。畢竟,GC優(yōu)化是要處理的整個(gè)優(yōu)化問題中最基本的。目前,Java中有四種供你選擇的垃圾收集算法。每種算法滿足不同的需求,因此你要選擇適合你的需求的。很多開發(fā)人員正是因?yàn)椴涣私釭C算法而沒有優(yōu)化他們的應(yīng)用。

這四個(gè)算法分別是串行回收器,并行/吞吐量回收器,CMS回收器和G1回收器。想要了解更多關(guān)于每種垃圾收集器的信息及它們是如何工作的,請查看這篇來自Takipi博客的非常棒的文章Garbage Collectors—Serial vs. Parallel vs. CMS vs. G1。這篇文章同時(shí)還討論了Java8對GC算法的影響及其他細(xì)節(jié)上的改變。

讓我們再回到GC算法上,根據(jù)Understanding Java Garbage Collection這篇文章所述,并發(fā)標(biāo)記和清除GC(即"CMS")算法才是適合網(wǎng)絡(luò)服務(wù)端應(yīng)用的最佳算法。并行GC算法則適合那些內(nèi)部可預(yù)測的應(yīng)用。

G1和CMS是并發(fā)操作的理想選擇,但仍然會引起應(yīng)用頻繁停頓。實(shí)際的選擇取決于你如何取舍。舉例來說,盡管選擇并行算法會帶來更長的GC停頓時(shí)間,但相較于其他GC算法,選擇并行算法仍是一個(gè)好主意。

3.Java 堆

Java內(nèi)存堆在迎合內(nèi)存需求方面擔(dān)任了至關(guān)重要角色。通常更好的做法是,初始時(shí)分配最小的堆,然后通過持續(xù)的測試不斷增加它的大小。大多數(shù)時(shí)候優(yōu)化問題都可以通過增加堆的大小解決,但如果存在大量的GC開銷,則該解決方案就不起作用。

GC開銷還會使吞吐量急劇下降,進(jìn)而使得應(yīng)用極其緩慢。此外,及早調(diào)整GC可以幫助你避免堆大小分配的問題。開始的時(shí)候,你可以選擇任何1GB到8GB的堆大小。當(dāng)你選擇正確的堆大小,老生代和新生代對象的概念也就不需要了。

總而言之,堆大小應(yīng)該取決于老生代和新生代對象的比率,之前的GC優(yōu)化和對象集合(即所有對象占用的內(nèi)存大小)。

4. 關(guān)鍵應(yīng)用優(yōu)化

關(guān)鍵代碼優(yōu)化是優(yōu)化你的Java應(yīng)用最好的方式。如果你的應(yīng)用對GC和堆優(yōu)化沒有反應(yīng),那么最好是做架構(gòu)改進(jìn)并關(guān)注于你的應(yīng)用是如何處理信息的。使用聰明的算法并管理好對象就能解決大量的問題,包括內(nèi)存碎片、堆大小問題和垃圾收集的問題。

5.使用最優(yōu)的函數(shù)

Java提供了多個(gè)函數(shù)來提升算法效率。如果你使用StringBuilder代替簡單的String,你可以得到微乎其微的性能提升。不過,我們還有其他方式在代碼層面進(jìn)行優(yōu)化。讓我們看看下面這些優(yōu)化方法。

使用StringBuilder代替+操作符。

避免使用iterator()。

多使用棧帶來的好處。

避免使用正則表達(dá)式,使用Apache Commons Lang作為代替。

遠(yuǎn)離遞歸。遞歸會占用大量資源!

要想查看更多關(guān)于代碼優(yōu)化的東西,請閱讀《十個(gè)最簡單的Java性能優(yōu)化技巧》。

總結(jié)

Java的性能優(yōu)化可是一個(gè)大課題,這片文章也只是拋磚引玉。如果您認(rèn)為文章還需要添加補(bǔ)充,別忘了在下面的評論中分享您的觀點(diǎn)。

原文: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

更多資料可關(guān)注二維碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容