线上java进程cpu,内存问题分析

cpu、线程问题代码追踪

# 查看使用CPU最高的前10个进程
ps -auxf | sort -nr -k 3 | head -10

# 查看该PID进程使用CPU最高的线程ID
top -Hp PID
# 或者
ps -mp 1605 -o THREAD,tid,time

# 转换为16进制
printf "%x\n" 线程ID

# 利用jstack查看线程信息
jstack -l PID | grep 16进制线程ID

创建通用shell脚本,第一个参数为java进程pid,第二个参数为数字,表示打印出前N个占用CPU最高的线程信息

#!/bin/bash
if [ $# -le 0 ]; then
    echo "usage: $0 <pid> [line-number]"
    exit 1
fi

# java home
if test -z $JAVA_HOME
then
    JAVA_HOME='/usr/local/jdk'
fi

#pid
pid=$1
# checking pid
if test -z "$($JAVA_HOME/bin/jps -l | cut -d ' ' -f 1 | grep $pid)"
then
    echo "process of $pid not exists"
    exit
fi

#line number
linenum=$2
if test -z $linenum
then
    linenum=10
fi

stackfile=stack$pid.dump
threadsfile=threads$pid.dump

# generate java stack
$JAVA_HOME/bin/jstack -l $pid >> $stackfile
ps -mp $pid -o THREAD,tid,time | sort -k2r | awk '{if ($1 !="USER" && $2 != "0.0" && $8 !="-") print $8;}' | xargs printf "%x\n" >> $threadsfile
tids="$(cat $threadsfile)"
for tid in $tids
do
    echo "------------------------------ ThreadId ($tid) ------------------------------"
    cat $stackfile | grep 0x$tid -A $linenum
done

rm -f $stackfile $threadsfile

jstack查询出来的线程堆栈有时候很多,不太好分析,可以使用一些工具导入线程堆栈图形化地来分析,比如这个在线分析平台: Java Thread Dump Analyzer

内存高问题追踪

# 启动时打印JVM启动参数
-XX:+PrintFlagsFinal
# 运行时打印java进程的JVM参数信息
jinfo -flags 6219
# top命令,shift+m可以按照内存排序,可以看到最高使用内存的进程PID
top
# 指定查看某个PID的信息
top -p 1605
# 查看某个PID的详细信息
ps -l 1605
# 查看使用内存最高的前10个进程
ps aux | sort -k4,4nr | head -n 10
ps -auxf | sort -nr -k 4 | head -10
# 查看使用CPU最高的前10个进程
ps -auxf | sort -nr -k 3 | head -10
# 对进程生成dump文件
jmap -dump:format=b,file=/tmp/dump.dat 6219
# 或者启动命令中加入启动参数,在OOM的时候自动生成dump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/of/dumpfile
# 根据进程名称找到进程信息
ps -aux|grep NAME
ps -ef|grep NAME

# 查看端口被哪个进程占用
sudo netstat -plan | grep 8080
ps <PID>

Althas使用方法

下载

Java 线上问题排查神器 Arthas 快速上手与原理浅谈

arthas 火焰图神器-async-profiler

火焰图–使用Async-profiler 对程序性能优化实战

arthas实战

参考

一次Java内存泄漏调试的有趣经历

利用mat定位内存泄露原因

JVM故障分析系列之一:使用jstack定位线程堆栈信息

一次生产 CPU 100% 排查优化实践

alibaba Arthas 用户文档

记 Arthas 实现一次 CPU 排查与代码热更新

应用系统瓶颈排查和分析的思考-Arthas 实战

Shallow Heap 和 Retained Heap的区别