jstat
jstat -gcutil
jstat -gcutil 28589 10000 30 #各分区情况,注意YGCT是否较大
jstat -gc 28589 1s 1 查看MU,可见永久带(变量)占用多大内存
Refer to
http://blog.csdn.net/zhaozheng7758/article/details/8623549
Javap 字节码查看
javap -c xxx.class
dump
jmap -dump:format=b,file=dumpFileName.hprof PID
jmap -dump:live,format=b,file=dumpFileName.hprof PID
通过MAT工具进行分析
jps
jps #查看服务进程号
jmap
jmap -histo:live 8697|head -n 23
jmap -histo:live 28589 >> /var/tmp/jmap17.txt #java对象分析
jmap -heap 18181 > heap$(date +%y%m%d%k%M%S).txt,保存heap(堆)信息
性能参考
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参数要多得多;
收集器
- 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>