jstat

jstat命令

Posted by Bug1024 on September 30, 2017

垃圾回收堆的行为统计

    # 每隔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