1、top
大写M : 对内存进行排序显示
大写P:对cpu进行排序显示
大写T:对运行时间进行排序显示
大写N:对PID进行排序显示
小写i: 直接过滤掉空闲进程
大写H:显示进程下的线程
-p :指定进程
小写c 显示整个命令行而不只是显示命令名。
2、jmap
#dump出文件
jmap -dump:format=b,file=heap.bin [PID]
#查看JVM内存配比
jmap -heap [pid]
#统计活对象
jmap -histo:live [PID]
3、netstat
统计端口状态
netstat -nat |grep 8080 |awk '{print $6}'|sort|uniq -c
4、nginx access.log分析
分析access.log获得访问前10位的ip地址
awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10
查看nginx的启动用户
ps aux | grep "nginx: worker process" | awk '{print $1}'
查看连接某服务端口最多的的IP地址
netstat -nat | grep "192.168.1.15:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
查看每个ip跟服务器建立的连接数
netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
最后,JVM分析
NEW :未启动的。不会出现在Dump中。
RUNNABLE :运行中状态,当调用thread.start()后,线程变成为Runnable状态。只要得到CPU,就可以执行。可能里面还能看到locked字样,表明它获得了某把锁。
RUNNING:线程正在执行;
BLOCKED :受阻塞并等待监视器锁。如果进入同步方法或同步代码块,没有获取到锁,则会进入该状态。
WATING :无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
TIMED_WATING :有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
DEAD:线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,表示该线程结束
其次,对于jstack日志,我们要着重关注如下关键信息
DEADLOCK:表示有死锁
Waiting on condition:等待某个资源或条件发生来唤醒自己。具体需要结合jstacktrace来分析,比如线程正在sleep,网络读写繁忙而等待
BLOCKED:阻塞
jstack统计线程数
jstack 13885 | grep 'java.lang.Thread.State' | wc -l
存在阻塞或死锁的线程
jstack 13885 |grep -E "RUNNING|BLOCKED"
其他:
jstack 13885 |grep -E "WATING |TIMED_WATING"
jstack 13885 |grep -E "DEADLOCK|DEAD"
系统慢,特别关注
Blocked,Waiting on condition
cpu高
非常可能线程执行有死循环,特别关注Runable状态。