jvisualvm线程cpu时间使用情况

时间:2014-12-10 11:18:37

标签: java performance jvisualvm

我使用 jvisualvm 来监控正在运行的java程序。当我深入研究线程cpu使用的细节时,我得到以下图片。 CPU使用率包括文件部分:Running,Sleeping,Wait,Park和Monitor。

我没有找到关于列的官方定义,所以我想知道这些列在java代码中的真正含义。

  • Running:执行时使用的时间。
  • Sleeping:Thread.sleep(long)?
  • Wait:?
  • Park:LockSupport.park?
  • Monitor:?

Thread CPU time usage

2 个答案:

答案 0 :(得分:3)

我做了一个简单的测试,发现这些列可以映射到java代码操作:

  • 睡觉Thread.sleep(..)
  • 等待Object.wait(..)
  • 暂停:当你在jdk5 +中使用新的并发对象时,可能会使用LockSupport.park
  • 监控:调用synchronized方法/对象

所以,wait / park / monitor都意味着该帖子是blocked,但是由于不同的原因而被阻止。


如果线程正在等待套接字,则可以在Running上计算时间。

enter image description here

在这张图片中, Thread-pool-Bill 大部分时间都是Running,但事实是它在插座上等待了很长时间:

"Thread-pool-Bill" - Thread t@42
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    - locked <79f0aad8> (a java.net.SocksSocketImpl)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

答案 1 :(得分:0)

  • 正在运行:线程在CPU上运行的时间
  • 睡觉:线程因Thread.sleep(…)
  • 而睡觉的时间
  • 等待:线程在资源上等待的时间(例如socket / tty)
  • Park:由于LockSupport.park()
  • 导致线程停放的时间
  • 监视器:在监视器上阻塞线程的时间(正如Evans Y.正确指出的那样,监视器在synchronized块/函数上被调用)