怎么通过linux命令去分析jvm里面那个线程阻塞了

怎么通过linux命令去分析jvm里面那个线程阻塞了,第1张

仍然需要生成jvm进程的thread dump data,便于与Linux top命令输出关联。步骤如下:

1)执行top命令,或使用-H选项(显示所有线程),找到相关的高CPU的PID

2)生成thread dump 快照(kill -3 PID)。

3)将top命令输出PID转换为HEX格式(16进制)

4)在thread dump data中搜索nid=<Hex PID>

5)分析受影响的thread和stack trace,精确定位代码。

top output sample

[plain] view plain copy

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND

...........

22111 userWLS 9 0 86616 84M 26780 S 0.0 40.1 0:00 java

pthread_join一般是主线程来调用,用来等待子线程退出,因为是等待,所以是阻塞的,一般主线程会依次join所有它创建的子线程。

pthread_exit一般是子线程调用,用来结束当前线程。

子线程可以通过pthread_exit传递一个返回值,而主线程通过pthread_join获得该返回值,从而判断该子线程的退出是正常还是异常。

用浅显的话来说吧。

在一般的情况下,在系统和应用程序之间有一个请求队列层,起到调度的作用,应用程序不会直接访问系统,而是把访问请求放进队列层中;而系统也在不停的从队列层中提取请求然后不断的分发执行,这种请求方式就是阻塞式访问。

但是有些特殊的请求是不允许停止和等待的,这种请求就不会被放入队列层中,而是直接插入到系统的当前处理的前端,而被优先执行,这种请求方式就是非阻塞式访问。

这二者的区别是由于其工作性质决定的,单纯从理论角度来说,与CPU占用等没有任何关系,CPU占用只和和算法复杂度有关。

一般非阻塞功能都是使用在系统级的请求上,比如某些驱动级的中断请求或实时类请求,因为绕过了请求队列,编制不良的非阻塞程序可能会导致系统失去响应。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8298190.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存