啟用 NUMA
numa 是一個(gè) CPU 的特性。SMP 架構(gòu)下,CPU 的核是對稱,但是他們共享一條系統(tǒng)總線。所以 CPU 多了,總線就會(huì)成為瓶頸。在 NUMA 架構(gòu)下,若干 CPU 組成一個(gè)組,組之間有點(diǎn)對點(diǎn)的通訊,相互獨(dú)立。啟動(dòng)它可以提高性能。
NUMA 需要硬件,操作系統(tǒng),JVM 同時(shí)啟用,才能啟用。Linux 可以用 numactl 來配置 numa,JVM 通過-XX:+UseNUMA 來啟用。
激進(jìn)優(yōu)化特性
在 Java1.6 中,激進(jìn)優(yōu)化(AggressiveOpts)是默認(rèn)開啟的。激進(jìn)優(yōu)化是一般有一些下一個(gè)版本才會(huì)發(fā)布的優(yōu)化選項(xiàng)。但是有可能造成不穩(wěn)定。前段時(shí)間以訛傳訛的 JDK7的 Bug,就是開啟這個(gè)選項(xiàng)后測到的。
逃逸分析
讓一個(gè)對象在一個(gè)方法內(nèi)創(chuàng)建后,如果他傳遞出去,就可以稱為方法逃逸;如果傳遞到別的線程,成為線程逃逸。如果能知道一個(gè)對象沒有逃逸,就可以把它分配在棧而不是堆上,節(jié)約 GC 的時(shí)間。同時(shí)可以將這個(gè)對象拆散,直接使用其成員變量,有利于利用高速緩存。如果一個(gè)對象沒有線程逃逸,就可以取消其中一切同步操作,很大的提高性能。
但是逃逸分析是很有難度的,因?yàn)榛?cpu 去對一個(gè)對象去分析,要是他不逃逸,就無法優(yōu)化,之前的分析血本無歸。所以不能使用復(fù)雜的算法,同時(shí)現(xiàn)在的 JVM 也沒有實(shí)現(xiàn)棧上分配。所以開啟之后,性能也可能下降。
可以使用-XX:+DoEscapeAnalysis 來開啟逃逸分析。
高吞吐量 GC 配置
對于高吞吐量,在年輕態(tài)可以使用 Parallel Scavenge,年老態(tài)可以使用 Parallel Old 垃圾收集器。
使用-XX:+UseParallelOldGC 開啟
可以將-XX:ParallelGCThreads 根據(jù) CPU 的個(gè)數(shù)進(jìn)行調(diào)整??梢允?CPU 數(shù)的1/2或者5/8
低延遲 GC 配置
對于低延遲的應(yīng)用,在年輕態(tài)可以使用 ParNew,年老態(tài)可以使用 CMS 垃圾收集器。
可以使用-XX:+UseConcMarkSweepGC 和-XX:+UseParNewGC 打開。
可以將-XX:ParallelGCThreads 根據(jù) CPU 的個(gè)數(shù)進(jìn)行調(diào)整??梢允?CPU 數(shù)的1/2或者5/8
可以調(diào)整-XX:MaxTenuringThreshold (晉升年老代年齡)調(diào)高,默認(rèn)是15.這樣可以減少年老代 GC 的壓力
可以-XX:TargetSurvivorRatio,調(diào)整 Survivor 的占用比率。默認(rèn)50%.調(diào)高可以提供 Survivor 區(qū)的利用率
可以調(diào)整-XX:SurvivorRatio,調(diào)整 Eden 和 Survivor 的比重。默認(rèn)是8。這個(gè)比重越小,Survivor 越大,對象可以在年輕態(tài)呆更多時(shí)間。