在32-bit或64-bit JVM之間進(jìn)行明智的選擇。如果程序運(yùn)行需要超過2GB內(nèi)存,并且JVM暫停時(shí)間在可接受范圍內(nèi),可以考慮使用64-bit JVM。
永遠(yuǎn)將應(yīng)用程序放在第一考慮。確保將其配置好,并根據(jù)程序的內(nèi)存占用量調(diào)整heap尺寸。建議通過性能和負(fù)載測(cè)試來衡量實(shí)時(shí)數(shù)據(jù)占有量。
larger heap并不總是表現(xiàn)得更好、更快,因此不需要過度調(diào)整Java heap。并行中的JVM性能調(diào)優(yōu),找準(zhǔn)機(jī)會(huì)減少或“spread”程序的內(nèi)存占有量,以保證JVM的平均響應(yīng)時(shí)間<1%。
對(duì)于32-bit JVM,為了從元數(shù)據(jù)和本地heap中留出一些內(nèi)存,考慮2GB的最大heap尺寸。
對(duì)于64-bit JVM,我們要想辦法在垂直和水平層面進(jìn)行擴(kuò)展,而不是試圖將Java heap尺寸增加到15GB以上。這種做法往往提供更好的吞吐量,更好地利用硬件,提高應(yīng)用程序的故障切換功能。
不許重復(fù)開發(fā):充分利用開源以及商業(yè)故障排除的優(yōu)勢(shì)和監(jiān)控工具,使這些變成可能。APM(應(yīng)用性能管理)產(chǎn)品在過去十年里發(fā)展迅猛。
JDK 1.8 Metaspace指南
目標(biāo)建議內(nèi)存大小GC調(diào)整
監(jiān)控和故障排除
默認(rèn)情況下,元空間內(nèi)存空間是無界的,并使用可用于動(dòng)態(tài)擴(kuò)展的process或OS native memory。內(nèi)存空間分成快并通過mmap被JVM進(jìn)行存儲(chǔ)。我們建議保持默認(rèn)設(shè)置,以動(dòng)態(tài)調(diào)整模式為出發(fā)點(diǎn),將簡(jiǎn)化的尺寸與密切監(jiān)測(cè)的應(yīng)用程序元數(shù)據(jù)占有量相結(jié)合,從而進(jìn)行更好的容量規(guī)劃。新增一個(gè)JVM選項(xiàng)(-XX:MaxMetaspaceSize=<NNN>),可以讓您限制分配給class metadata的本地內(nèi)存。當(dāng)面臨物理資源(RAM)緊張或類似于內(nèi)存泄露的情況時(shí),建議將它作為一個(gè)保障機(jī)制。
對(duì)那種具有l(wèi)arger class metadata footprint或dynamic classloading的Java應(yīng)用程序,我們建議通過新的JVM選項(xiàng)調(diào)整初始元空間大小 :-XX:MetaspaceSize=<NNN>,例如:1GB。這種調(diào)整方法將有助于避免包括class metadata在內(nèi)的早期垃圾回收,尤其是在Java應(yīng)用程序的 “warm-up”期。
Hot Spots

故障診斷和監(jiān)視
目標(biāo)建議測(cè)量和監(jiān)視應(yīng)用程序YoungGen和OldGen內(nèi)存占用,包括GC活動(dòng)。為您的應(yīng)用程序決定正確的GC策略和Java堆大小。
調(diào)整應(yīng)用程序的內(nèi)存占用量,如live對(duì)象。
分析、監(jiān)控您所使用的Java分析工具,如JProfiler、Java VisualVM或其他商業(yè)APM產(chǎn)品。允許通過–verbose:gc記錄JVM GC活動(dòng)。您也可以使用類似GCMV(GC Memory Visualizer)的工具查看JVM的暫停時(shí)間和內(nèi)存分配率。
性能提示:過多的內(nèi)存分配率可能意味著需要進(jìn)行垂直和橫向擴(kuò)展,或從多個(gè)JVM進(jìn)程中分離出實(shí)時(shí)數(shù)據(jù)。
為了long-lived對(duì)象或long-term實(shí)時(shí)數(shù)據(jù)考慮,可以生成并分析JVM heap dump快照。Heap dump分析對(duì)于程序內(nèi)存占用(retention)的優(yōu)化是非常有幫助的。
性能提示:由于從32位到64位,Java應(yīng)用程序?qū)eap 的需求會(huì)比原來高1.5倍。所以,在Java 1.7及以下的版本(這是默認(rèn)的)中使用 -XX:+UseCompressedOops是非常重要的。這樣的參數(shù)調(diào)整大大減輕了64位JVM的性能壓力。
調(diào)查OutOfMemoryError 問題,尋找OldGen內(nèi)存泄露的根源。使用類似Java VisualVM、Plumbr的工具(Java內(nèi)存泄漏檢測(cè)器),分析可能存在的內(nèi)容泄露。性能提示:要著重分析最大的Java對(duì)象上。要意識(shí)到降低內(nèi)存占有量就意味著提升性能,并降低GC活動(dòng)。
#FormatImgID_10#