Linux 对java进程分析

Linux 下 对java进程分析

JDK8

Linux

留存线程

  • jstack主要用来查看某个Java进程内的线程堆栈信息
  • 打一次线程dump
  • jstack pid > t.txt
  • 每间隔5秒打三次线程dump
  • for i in {1..3};do jstack -l pid >> $ip_$(date +%Y%m%d_%T).txt;i+=1;sleep 5;done

  • 查看当前进程里面的线程情况top -H -p pid

upload successful

  • 文件可以使用 java -jar jca4614.jar进行查看

留存内存对象

  • jmap导出堆内存
  • jmap -dump:live,format=b,file=dump.hprof pid
  • 导出的文件可以用Jprofiler或者jvisualvm进行分析

  • 查看占用内存最大的对象前100jmap -histo pid|head -100

留存gc

  • 在线上看gc是否频繁和耗时
  • jstat -gcutil ${pid} 1000 每隔一秒打印一次GC

upload successful

可以看到,单次 Young GC 平均耗时是 60ms 左右,还是不错的,但是Young GC(YGC )非常频繁,基本上每秒一次,有时还会一秒两次,在一秒两次的时候,Young GC对系统响应的压力就会比较明显。

jstat相关指标说明:

  • YGCT:Young GC 总时间,单位为秒
  • YGC:Young GC 次数
  • FGCT:Full GC 总时间,单位为秒
  • FGC:Full GC 次数
  • GCT:GC 总时间,是 YGCT 和 FGCT 之和
    接着查看 GC log,打印 GC log 需要在 JVM 启动参数里添加如下参数:

  • -XX:+PrintGCDateStamps:打印 GC 发生的时间戳。

  • -XX:+PrintTenuringDistribution:打印 GC 发生时的代龄信息。
  • -XX:+PrintGCApplicationStoppedTime:打印 GC 停顿时长
  • -XX:+PrintGCApplicationConcurrentTime:打印 GC 间隔的服务运行时长
  • -XX:+PrintGCDetails:打印 GC 详情,包括 GC 前/内存等。
  • -Xloggc:../gclogs/gc.log.date:指定 GC log 的路径

upload successful