1. 使用top命令查看cpu占用高的进程
cpu使用率参数含义:
%us:us:用户空间占用CPU的百分比。简单来说,高我们是由程序引起的。通过分析线程堆栈很容易找到有问题的线程。
%sy:内核空间占用CPU的百分比。当sy为高时,如果它是由程序引起的,那么它基本上是由于线程上下文切换。
%ni:表示用户空间且通过nice调度过的程序的cpu使用率。
%id:空闲cpu
%wa:cpu运行时在等待io的时间
%hi:cpu处理硬中断的数量
%si:cpu处理软中断的数量
%st:被虚拟机偷走的cpu
%CPU为什么会超过100%?
%CPU是指进程占每个核的百分比之和,假设你的机器是2个cpu,每个cpu 4核,那么%CPU的最大值可以达到800%
2. 查看某个进程中所有线程的资源占用 top -Hp pid
3. 查看java线程信息
printf "%x " tid 可以获取tid的16进制
jstack pid |grep -A 10 tid的16进制
java进程状态
NEW // 没有启动过的线程状态,当程序使用 new 关键字创建了一个线程之后,该线程就处于新建状态,此时仅由 JVM 为其分配 内存,并初始化其成员变量的值
RUNNABLE // 当线程对象调用了 start()方法之后,该线程处于就绪状态。Java 虚拟机会为其创建方法调用栈和 程序计数器,等待调度运行。
BLOCKED // 阻塞状态,等待锁(monitor lock)
WAITING //等待状态,等待其他线程的某个操作,例如Object.wait Thread.join
TIMED_WAITING //带有超时时间的等待状态
TERMINATED //已终止线程状态
备注:
如果大量的线程处于BLOCKED(on object monitor) 状态,可能是一个全局锁阻塞了大量线程。
- java.lang.Thread.State: WAITING (parking):一直等那个条件发生;
- java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。
线程状态为”Object.wait()“:
说明这个线程之前获得了某个monitor,进入临界区,但是发现执行条件不满足,调用object.wait进入Wait Set
此时线程状态大致分为:
- java.lang.Thread.State:WAITING (on object monitor)
- java.lang.Thread.State: TIMED_WAITING (on object monitor)
如果大量的线程在waiting on condition状态,可能是第三方资源迟迟获取不到导致大量线程进入等待状态,比如网络资源等。所以如果你发现有大量的线程都处在 Wait on condition,从线程堆栈看,正等待网络读写,这可能是一个网络瓶颈的征兆,因为网络阻塞导致线程无法执行。
获取monitor过程
每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。
参考博客:https://www.cnblogs.com/noteless/p/10372674.html
https://www.cnblogs.com/zhengyun_ustc/archive/2013/03/18/tda.html