垃圾回收
Java垃圾回收流程對于程序性能是至關(guān)重要的。為了提供有效的垃圾回收,Heap(堆)本質(zhì)上是劃分在子區(qū)域中。
堆區(qū)域
區(qū)域描述最新一代-Young Generation (nursery space)新的或短暫的對象分配保留堆的一部分。垃圾被一個fast but stop-the-world YG的收集器進行回收。
在young space中呆了足夠久的對象就會提升到old space。
注意:YG space的尺寸和GC頻率過高將會顯著影響程序的響應(yīng)時間,從而導(dǎo)致JVM的暫停時間增加。
老一代-Old Generation (tenured space)heap的一部分留給了long-lived對象。垃圾通常通過平行或并發(fā)(多數(shù)時候)進行收集,諸如CMS或gencon (IBM JVM)。
性能提示:根據(jù)應(yīng)用程序的需求選擇并測試最佳的GC策略是非常重要的。例如,當(dāng)切換到并發(fā)GC收集(如CMS或G1)可以顯著提高應(yīng)用程序的平均響應(yīng)時間(減少延遲)。

GC Collectors
選擇正確的collector或GC policy可以將程序的性能、可擴展性和可靠性優(yōu)化到最佳狀態(tài)。許多應(yīng)用程序?qū)τ陧憫?yīng)時間延遲都很敏感,因此大多需要使用并發(fā)的回收器,例如HotSpot CMS或IBM GC policy balanced。
我們強烈建議您通過適當(dāng)?shù)男阅芎拓?fù)載測試確定最合適的GC策略。應(yīng)該在生產(chǎn)環(huán)境中執(zhí)行全面監(jiān)控策略,以跟蹤整體的JVM性能,并確定在之后需要改進的領(lǐng)域。
GC論據(jù)描述串行回收器-XX:+UseSerialGC (Oracle HotSpot)無論新舊回收器都使用單獨CPU,像是一種stop the world的時尚。#FormatImgID_5#并行回收器(吞吐量回收器)-XX:+UseParallelGC-XX:+UseParallelOldGC(Oracle Hotspot)
-Xgcpolicy:optthruput
(IBmJ9, single space, stop-the-world)
旨在利用CPU的內(nèi)核優(yōu)勢。無論新舊回收器都使用多個Gcthreads(via –XX:ParallelGCThreads=n),從而更好地利用來自主機的可用的CPU內(nèi)核來完成。注意:雖然回收時間可以顯著減少,但是有著大尺寸堆的程序面臨著large、stop-the-world、old回收,并且響應(yīng)時間也受到影響。#FormatImgID_6#確保適當(dāng)?shù)腜ermanent Generation / Metaspace和本地內(nèi)存大小。密切監(jiān)視你的PermGen、元空間和本機內(nèi)存利用率,并調(diào)整到適合的最大容量。分析程序類加載器的大小,并尋找機會適當(dāng)?shù)販p少元數(shù)據(jù)足跡。注意:YoungGen collections仍然有stop-the-world事件,因此需要適當(dāng)?shù)奈⒄{(diào),以減少總JVM暫停時間。
#FormatImgID_7#
Garbage First (G1) Collector
HotSpot G1 collector是專為是專為滿足用戶定義的垃圾回收(GC)高概率暫停時間設(shè)計的,同時實現(xiàn)高吞吐量。
最新的HotSpot collector將heap基本劃分到一組大小相等的堆區(qū)域,虛擬內(nèi)存的每個區(qū)域連續(xù)范圍。它將回收壓縮的活動集中在heap區(qū)域,那里充滿了可回收的對象(garbage first)。換句話說就是,這個區(qū)域有最低限度的“live”對象。
Oracle建議在以下例子和情況下使用G1 collector,尤其是對于目前正在使用CMS或parallel collectors的:
專為large heaps(>= 6 GB),并限制GC延遲(暫停時間<= 0.5秒)的應(yīng)用程序設(shè)計。
超過50%的Java heap被實時數(shù)據(jù)占用(對象不能被GC回收)。
對象分析率和促進作用顯著變化。
不期望過長的垃圾回收或壓縮停頓(超過0.5至1秒)。

Java Heap尺寸
你一定要知道沒有GC策略可以挽救Java Heap尺寸不足的現(xiàn)象。這些演習(xí)涉及到為不同的存儲空間(包括新舊不同的版本)配置最大和最小的容量,包括元數(shù)據(jù)和本地內(nèi)存容量。這里有一些建議準(zhǔn)則: