如何精确判断一个java线程是否能占用cpu时间?

gogo111007 2015-09-30
例如一个在等待io的java线程(select,poll,...),状态仍然是RUNNABLE,但其实是阻塞的。

如何才能过滤出那些真正会被cpu调度的线程?

我目前是通过比较调用栈上的类名和方法名,来过滤掉那些通常情况的伪运行的线程,但是这种做法明显很蛋疼,也不可能过滤的全。
claude728 2015-10-02
java有个命令叫jstack,你可以试试!
cywhoyi 2015-10-03
1.先查看系统cpu调度sys
2.通过CPU memory较高的
3.JPS、JSTACK

基本步骤都这么过来的,如果想要通过界面可能通过jvisualvm等,不过推荐下点评网的开源通过mxbean的实现的调度品改https://github.com/dianping/cat
backkom1982 2015-10-07
  • 通过top -H –p pid找到pid进程中占用cpu多的线程tid
  • 使用jstack 命令dump线程信息,以便根据TID寻找到具体的线程栈信息
  • 线程dump文件里的nid与通过top命令抓取到的tid相对应,只不过nid是十六进制表示,需要进行转换。
vlinux 2015-10-07
你永远也做不到最精确的,perf也做不到。你能做到的只能是近似精确。
推荐一个国人开发的工具 https://github.com/coderplay/perfj
gogo111007 2015-10-08
额,没说清楚。

我是指如何用程序代码判断,不是人判断,也不是开剖分工具看。

我这边线上的系统没法附工具进去(附一次崩一次),我自己写了个远程调用,打印所有线程的调用栈,但是有很多,看得我眼花,所以想先代码过滤一下,把那些没在跑的线程滤掉,现在是用状态在过滤,但是过滤不完整。
liuwenjie517333 2015-10-09
没懂楼主的,“那些真正会被cpu调度的线程”,就拿楼主说的“例如一个在等待io的java线程(select,poll,...),状态仍然是RUNNABLE,但其实是阻塞的”。这个线程后续会被CPU调度,算是真正会被cpu调度吗?如果不是,个人大胆猜测楼主指的是当前时间正在被cpu执行的线程,如果是这样,那在某一确定的时刻,比如1个cpu的机器上,某一个具体的时间,cpu只能执行1个线程。
gogo111007 2015-10-14
liuwenjie517333 写道
没懂楼主的,“那些真正会被cpu调度的线程”,就拿楼主说的“例如一个在等待io的java线程(select,poll,...),状态仍然是RUNNABLE,但其实是阻塞的”。这个线程后续会被CPU调度,算是真正会被cpu调度吗?如果不是,个人大胆猜测楼主指的是当前时间正在被cpu执行的线程,如果是这样,那在某一确定的时刻,比如1个cpu的机器上,某一个具体的时间,cpu只能执行1个线程。


在io中的线程,io完成前一直都不会被调度的,像等select的线程,对端一直不发数据就一直不被cpu调度,而不是所谓的“虽然当前没有被调度,但是可能会被调度的线程”。

我在找cpu负担的时候,像这样在等数据,等监听客户端的线程,自然应该排除出去。
liuwenjie517333 2015-10-16
恩,想到一个比较笨的方法。在一定时间内,找到正在运行的线程,然后在对应线程执行的业务里加加日志,看是否有执行日志。希望能对楼主有用
Global site tag (gtag.js) - Google Analytics