.、用 ps -ef | grep -i java 命令,找出 Java|tomcat 进程 pid,用于查看全格式进程。
.、用 ps -aux | grep -i java 命令,找出 Java|tomcat 进程 pid,用于查看进程。
.、用 top -Hp <pid> 命令,找出 CPU 占用最高的线程 pid,按cpu使用率从大到小排序。
.、用 ps aux | grep <pid> 命令,找出CPU占用最高的进程信息。
.、用 ps -mp <pid> -o THREAD,tid,time 命令,找出占用 CPU 最高的线程 tid。
.、用 printf "%x\n" <tid> 命令,将线程tid转换为16进制。
.、用 jstack -l <pid> 命令,打印线程当前堆栈信息到控制台。
.、用 jstack -l <pid> > jstackFile.log 命令,打印线程当前堆栈信息到文件。
.、用 jstack <pid>命令查看当前java进程的堆栈状态。
.、用 jstack <pid> | grep <tid> -A 30 命令,打印线程的堆栈信息到控制台。
.、用 jstack <tid> | grep 2ea >trace.dump 命令,打印线程的堆栈信息到文件。
.、用 grep <tid> -A20 trace.dump 命令,打印线程的堆栈信息到文件。
使用jstack pid命令可以查看JVM的线程状态,其中值得关注的线程状态有: 死锁,Deadlock(重点关注)
执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on
monitor entry(重点关注) 暂停,Suspended 对象等待中,Object.wait() 或 TIMED_WAITING
阻塞,Blocked(重点关注) 停止,Parked
含义如下所示: Deadlock:死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
Runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。
Waiting on condition:等待资源,或等待某个条件的发生。具体原因需结合 stacktrace来分析。
一种情况是网络非常忙,几乎消耗了所有的带宽,仍然有大量数据等待网络读写;
另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。
如果堆栈信息明确是应用代码,则证明该线程正在等待资源。一般是大量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取。
又或者,正在等待其他线程的执行等。 如果发现有大量的线程都在处在 Wait on condition,从线程
stack看,正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。 另外一种出现 Wait on
condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒。
Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。
Waiting for monitor entry 和 in Object.wait():Monitor 是
Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个
monitor。从下图1中可以看出,每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active
Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait
Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait
Set”中等待的线程状态是 “in Object.wait()”。
线程优先级:最低1,最高10,默认5,优先级高的不一定先执行;
线程动作(本地线程状态):线程状态产生的原因
---runnable:此时线程状态一般为RUNNABLE;
---in Object.wait():等待区等待,此时线程状态为WAITING或TIMED_WAITING;(执行了obj的wait方法释放了锁)
---waiting for monitor entry:进入区等待,等待进入一个临界区,所以它在”Entry Set“队列中等待,线程状态一般是 BLOCKED(执行到了同步代码段);
---waiting on condition:等待区等待、被park,等待另一个条件的发生来把自己唤醒,线程状态是:WAITING(parking,一直等那个条件发生)或 TIMED_WAITING (parking或sleeping,定时的,那个条件不到来,也将定时唤醒自己);
---sleeping:休眠的线程,调用了Thread.sleep();
调用修饰:表示线程在方法调用时,额外的重要的操作
---locked <地址/锁ID> 目标:使用synchronized申请对象锁成功,监视器的拥有者;
---waiting to lock <地址/锁ID> 目标:使用synchronized申请对象锁未成功,在进入区等待;
---waiting on <地址/锁ID> 目标:使用synchronized申请对象锁成功后,释放锁在等待区等待;
---parking to wait for <地址/锁ID> 目标:park是基本的线程阻塞原语,不通过监视器在对象上阻塞,与synchronized体系不同;
尖括号中表示锁ID,这个是系统自动产生的,我们只需要知道每次打印的堆栈,同一个ID表示是同一个锁即可。
---当一个线程占有一个锁的时候,线程的堆栈中会打印--locked<0x00000000d77d50c8>
---当一个线程正在等待其它线程释放该锁,线程堆栈中会打印--waiting to lock<0x00000000d77d50c8>
---当一个线程占有一个锁,但又执行到该锁的wait()方法上,线程堆栈中首先打印locked,然后又会打印--waiting on <0x00000000d77d50c8>
————————————————
版权声明:本文为CSDN博主「故渊飞鱼的网络日志」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/YanzhenDu/article/details/105778779
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。