Code-Life
Code-Life copied to clipboard
Java Project 性能问题如何去调研
先列举一些问题
如何查看Java Project的
- 进程 线程id
- 占用的资源(cpu,内存,磁盘,socket链接)
- 机器网卡情况查看
- 线程情况 (jstack)
- 对象占用堆栈情况 (jmap)
- 客户端与服务端网络带宽
- gc情况
- 线程池和连接池情况
查看进程
- 方案一
top
查看占用CPU or MEM
最多的pid
- 方案二
jps -l
查找出java进程的pid 或ps -aux | grep java
ps不同参数的区别
-
ps -aux | grep gateway-app.jar
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 18836 24.4 6.8 309864980 36248072 pts/0 Sl 11:55 68:02 java -cp .:/ -Xms160G -Xmx256G -Xmn32G -XX:SurvivorRatio=4 -XX:+HeapDumpOnOutOfMemoryError -Dspring.config.location=file:./config/application.yml,file:./config/application-def.yaml -Dlog4j2.configurationFile=file:./config/log4j2.xml -jar /home/yituadmin/zdr/gateway_install/bin/../gateway-app.jar
-
ps -ef | grep gateway-app.jar
UID PID PPID C STIME TTY TIME CMD
root 18836 1 24 11:55 pts/0 01:08:20 java -cp .:/ -Xms160G -Xmx256G -Xmn32G -XX:SurvivorRatio=4 -XX:+HeapDumpOnOutOfMemoryError -Dspring.config.location=file:./config/application.yml,file:./config/application-def.yaml -Dlog4j2.configurationFile=file:./config/log4j2.xml -jar /home/yituadmin/zdr/gateway_install/bin/../gateway-app.jar
查看线程情况
获取到pid
后,使用top -p ${pid}
或者 htop -p ${pid}
刚开始只会展示一行,然后使用shift + h
就可以展开这里所有的线程了,除了第一行是进程,下面全是线程
肉眼观察到占用资源最多的线程idtid
,并且转换为用printf %x %{tid}
16进制
然后用jstack -l ${pid} | grep ${tid} -A 20
查看占用的资源
cpu, 内存
- 查询pid
ps -aux | grep ${programName}
- 根据pid查询cpu,memory
top -p ${pid}
查询socket
- 根据pid查询socket
netstat -autpn | grep 24572 | awk '/^tcp/ {++S[$(NF-1)]} END {for (a in S) print a, S[a]}'
查询网卡带宽
-
ifconfig
查看对应的网卡 -
sudo ethtool eth0
eth0是对应的网卡,然后就能看到参数