Java jvisualvm线程cpu时间使用率

Java jvisualvm线程cpu时间使用率,java,performance,jvisualvm,Java,Performance,Jvisualvm,我正在使用jvisualvm来监视正在运行的java程序。当我深入了解线程cpu使用情况的细节时,我得到了以下图片。CPU使用包括文件部分:运行、睡眠、等待、停驻和监视 我没有找到任何关于列的官方定义,所以我想知道这些列在java代码中的真正含义是什么 运行:执行过程中使用的时间 睡眠:线程。睡眠(长) 等待: Park:LockSupport.Park 监视器: Running:线程在CPU上运行的时间 休眠:线程因线程而休眠的时间。休眠(…) 等待:线程等待资源的时间(例如套接字/tt

我正在使用jvisualvm来监视正在运行的java程序。当我深入了解线程cpu使用情况的细节时,我得到了以下图片。CPU使用包括文件部分:运行、睡眠、等待、停驻和监视

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

  • 运行
    :执行过程中使用的时间
  • 睡眠
    :线程。睡眠(长)
  • 等待
  • Park
    :LockSupport.Park
  • 监视器

  • Running:线程在CPU上运行的时间
  • 休眠:线程因
    线程而休眠的时间。休眠(…)
  • 等待:线程等待资源的时间(例如套接字/tty)
  • Park:线程由于锁定支持而停止的时间。Park()
  • 监视器:线程在监视器上被阻塞的时间(正如Evans Y.正确指出的,监视器在
    同步的
    块/函数上被调用)

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

  • 睡眠
    线程。睡眠(..)
  • 等待
    对象。等待(…)
  • Park:当您使用新的并发对象时,在jdk5+中引入,它可能使用了
    LockSupport.Park
  • 监视:调用
    同步
    方法/对象时
因此,wait/park/monitor都意味着线程被阻塞了,但是由于不同的原因被阻塞了


如果某个线程正在等待套接字,则时间可能以运行<代码>为准

在这张图片中,线程池账单大部分时间都在
运行
,但事实是它在套接字上等待了很长时间:

"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)
“线程池账单”-线程t@42
java.lang.Thread.State:可运行
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
-锁定(一个java.net.socksocketimpl)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)

那么
监视器是什么意思?