垃圾回收堆的行为统计
# 每隔2000ms输出pid为1234的gc情况,一共输出20次
jstat -gc 1234 2000 20
# 同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
jstat -gccapacity 1234
# 同-gc,不过输出的是已使用空间占总空间的百分比
jstat -gcutil 1234
# 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
jstat -gccause 1234
# 统计新生代的行为
jstat -gcnew 1234
# 新生代与其相应的内存空间的统计
jstat -gcnewcapacity 1234
- C即Capacity 总容量,U即Used 已使用的容量
- S0C : survivor0区的总容量
- S1C : survivor1区的总容量
- S0U : survivor0区已使用的容量
- S1U : survivor1区已使用的容量
- EC : Eden区的总容量
- EU : Eden区已使用的容量
- OC : Old区的总容量
- OU : Old区已使用的容量
- PC 当前perm的容量 (KB)
- PU perm的使用 (KB)
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时间
GC日志
[GC [<收集器>: <Young区在GC前占的内存> -> <Young区在GC后占用的内存>(总大小) <Young区局部收集时JVM暂停处理的时间> secs] <JVM Heap在GC前占的内存> -> <JVM Heap在GC后占用的内存>(), <GC过程中JVM暂停处理的总时间>]]
如果 Young区在GC后占用的内存 - Young区在GC后占用的内存 = JVM Heap在GC后占用的内存 - JVM Heap在GC前的内存,则表示GC对象完全被回收,没有对象进入Old区或者Perm区。如果等号前面的值大雨后面的值,那么差值就是这次回收对象进入Old或者Perm区的大小。如果随着时间延长,JVM Heap在GC后占用的内存一直增长,而且Full GC频繁,那么可能就是内存泄露了。
其他
# 分析cpu使用率高的java线程
ps -mp PID -o THREAD,tid,time|sort -rn
printf "%x\n" TID
jstack PID|grep TID -A 80|less
# 查看某个进程占用CPU高的线程
top -Hp PID -d 1 -n 1