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

- 文件可以使用
java -jar jca4614.jar进行查看
留存内存对象
- jmap导出堆内存
jmap -dump:live,format=b,file=dump.hprof pid导出的文件可以用
Jprofiler或者jvisualvm进行分析查看占用内存最大的对象前100
jmap -histo pid|head -100
留存gc
- 在线上看
gc是否频繁和耗时 jstat -gcutil ${pid} 1000每隔一秒打印一次GC

可以看到,单次 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 的路径
