收集器
Serial收集器(单线程,基本不用)
ParNew收集器(多与CMS配合使用)
CMS(Concurrent Mark Sweep)收集器
G1(Garbage First)收集器
CMS
-XX:+UseConcMarkSweepGC
-XX:UseParNewGC
-XX:CMSInitiatingOccupancyFraction
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction
-XX:+CMSClassUnloadingEnabled
-Xms
-Xmx
-Xmn
-Xss
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
G1
-XX:G1HeapRegionSiz
-XX:MaxGCPauseMillis
-XX:G1NewSizePercent
-XX:G1MaxNewSizePercent
-XX:ParallelGCThreads
-XX:ConcGCThreads
-XX:+UseG1GC
LOG
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime
-Xloggc:<filename>
JSTAT
jstat -gcutil <PID> <MS> <TIMES>
DUMP
jmap -dump:format=b,file=dumpFileName.hprof PID
jmap -dump:live,format=b,file=dumpFileName.hprof PID
查看gc日志
通过MAT工具进行分析
性能参考
Minor GC执行时间(小于50ms)
Minor GC执行不频繁(大概10秒一次)
Full GC执行时间(小于1s)
Full GC执行不频繁(10分钟一次)
目标
GC的时间足够的小
· GC的次数足够的少
· 发生Full GC的周期足够的长
JVM调优的原则
· 多数的Java应用不需要在服务器上进行GC优化;
· 多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;
· 在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);
· 减少创建对象的数量;
· 减少使用全局变量和大对象;
· GC优化是到最后不得已才采用的手段;
· 在实际使用中,分析GC情况优化代码比优化GC参数要多得多;