堆
-Xms starting堆初始大小
-Xmx max堆最大容量
-Xmn new新生代大小
栈
-Xss 设置每个线程的栈大小
线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
JVM可创建的最大线程数限制因素:线程栈大小——》进程的最大内存——》操作系统位数
元空间
-XX:MaxMetaspaceSize=128M
堆溢出DUMP
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/
Eden S0 S1比例
-XX:SurvivorRatio=8 表示Eden:Survivor=8:1
GC日志
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:../logs/gc.log
5.617: [GC 5.617: [ParNew: 43296K->7006K(47808K), 0.0136826 secs] 44992K->8702K(252608K), 0.0137904 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
日志解释如下:
5.617(时间戳): [GC(Young GC) 5.617(时间戳): [ParNew(GC的区域): 43296K(垃圾回收前的大小)->7006K(垃圾回收以后的大小)(47808K)(该区域总大小), 0.0136826 secs(回收时间)] 44992K(堆区垃圾回收前的大小)->8702K(堆区垃圾回收后的大小)(252608K)(堆区总大小), 0.0137904 secs(回收时间)] [Times: user=0.03(GC用户耗时) sys=0.00(GC系统耗时), real=0.02 secs(GC实际耗时)]
垃圾年龄
-XX:MaxTenuringThreshold
垃圾收集器
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
内存大小设置
依据的原则是根据Java Performance里面的推荐公式来进行设置
- Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍
- 永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。
- 年轻代Xmn的设置为老年代存活对象的1-1.5倍。
- 老年代的内存大小设置为老年代存活对象的2-3倍。
- Sun官方建议年轻代的大小为整个堆的3/8左右
如何确认老年代存活对象大小?
JVM参数中添加GC日志,GC日志中会记录每次FullGC之后各代的内存大小,观察老年代GC之后的空间大小。可观察一段时间内(比如2天)的FullGC之后的内存情况,根据多次的FullGC之后的老年代的空间大小数据来预估FullGC之后老年代的存活对象大小(可根据多次FullGC之后的内存大小取平均值)
JVM种类
Hotspot, JRockit(Oracle)
J9, JikesRVM(IBM)
Zulu, Zing (Azul)