JVM 記憶體調校
JVM記憶體相關參數
- Xmx : 記憶體使用上限
- Xms : 記憶體使用下限(啟始值)
- Xss : stack
- server :
- client :
- XX:PermSize : Perm for Permanent:編譯後的class,或固定的資料結構會佔用這一個值
- XX:MaxGCPauseMillis : GC暫停的毫秒數,這個只是”建議”GC而已,GC會儘量滿足這個建議值
- XX:+ScavengeBeforeFullGC :
- XX:-UseParallelOldGC :
- XX:NewRatio : sets the size of the old generation to three times the size of the new generation
圖片來源 :Red Stack’s Blog
GC就是在空間不足時,將不活躍的物件從記憶體中移除,如果在GC時存活下的物件,就可能很上晉昇(Young → Old → Permanent)
- Permanent Generation:Old Generation進行GC(major GC or full GC)後,如空間不夠,就會將Old Generation活躍的物件(未被GC的)移到這區。建立越多的物件,此區域就要越大
- Old Generation: 當Young Generation進行gc (minor GC)後,空間仍舊不夠放新建立的物件時,會將Young Generation移到Old Generation
- New(Young) Generation():
- to: Survivor space1(S1) gc時,會將eden區未被gc的物件COPY到S1或S2區
- from: Survivor space2(S2) gc時,會將eden區未被gc的物件COPY到S1或S2區
- eden: (伊甸) 看名字就知道是新生命(New Object)誕生的地方,每new一個Object時會佔用這個區域,eden滿了,會引發gc (minor GC)
Heap= Old Generation + New Generation
可以透過JDK內附的virtualVm來觀察jvm memory的使用情形
常用工具
- jinfo
- jmap
- jstack
- jstat
- java.lang.management (API level)
Resources
- 簡單而清楚的JVM Memory教學
- infoQ中國站關於gc的文章(簡體中文)
- http://java.sun.com/docs/hotspot/gc/
- 10 jvm options java developers should know
- Eclipse MAT - 這個比virtualVM更好用
- Eclipse MAT使用的文章
- GC
- 說明GC的機制及時機,有5種gc策略的說明
- 如何監控GC的教學