Yourkit Java 分析器:Object.wait() 的 WALL TIME 可能测量不正确
Yourkit Java Profiler: WALL TIME is probably measured incorrectly for Object.wait()
我试图解决的最初问题是查看跨多个线程的方法的所有子调用的挂起时间。但是我用一个微型应用程序复制了我的问题,其中我有一个线程执行一种方法,该方法大部分时间都在按预期等待。
如您所见,我对 pool-1-thread-2 执行方法特别感兴趣 "com.sum.$Proxy10.uploadWaiting()"
所以我肯定知道这个方法在 getConnection() 中花费了它的大部分 "WALL TIME" ,它下降到 Object.wait(long)
但后来我想看看在 com.sum.$Proxy10.uploadWaiting() 中花费在 getConnection() 上的 WALL TIME 的确切百分比是多少。
我去 "Method list" -> 我的方法 -> 合并被调用方
如您所见,getConnection() 仅占我方法总时间的 1%。而且我已经配置我的采样来为所有方法做挂钟时间。正如您在屏幕截图中看到的那样,这些都被标记为 [Wall Time]。我正在使用 Yourkit 2015 版本 15052。
问题:为什么 getConnection() 没有显示 90% 之类的东西?它仍然只计算 CPU 时间而不计算墙时间吗?
Yourkit 支持回答了我的问题,答案是我必须使用
-Dyjp.zero.time.methods=假
为了让 UI 显示适当的 WALL TIME。默认情况下为真,并覆盖所有内容,包括挂钟时间设置。
放置位置取决于操作系统和 Yourkit 版本:https://www.yourkit.com/docs/kb/open_huge_snapshot.jsp 对我来说(MacOS 和 Yourkit 2015 版)恰好是:
<key>JVMOptions</key>
<array>
...
<!-- my fix to the UI-->
<string>-Dyjp.zero.time.methods=false</string>
</array>
我试图解决的最初问题是查看跨多个线程的方法的所有子调用的挂起时间。但是我用一个微型应用程序复制了我的问题,其中我有一个线程执行一种方法,该方法大部分时间都在按预期等待。
如您所见,我对 pool-1-thread-2 执行方法特别感兴趣 "com.sum.$Proxy10.uploadWaiting()" 所以我肯定知道这个方法在 getConnection() 中花费了它的大部分 "WALL TIME" ,它下降到 Object.wait(long) 但后来我想看看在 com.sum.$Proxy10.uploadWaiting() 中花费在 getConnection() 上的 WALL TIME 的确切百分比是多少。 我去 "Method list" -> 我的方法 -> 合并被调用方
如您所见,getConnection() 仅占我方法总时间的 1%。而且我已经配置我的采样来为所有方法做挂钟时间。正如您在屏幕截图中看到的那样,这些都被标记为 [Wall Time]。我正在使用 Yourkit 2015 版本 15052。
问题:为什么 getConnection() 没有显示 90% 之类的东西?它仍然只计算 CPU 时间而不计算墙时间吗?
Yourkit 支持回答了我的问题,答案是我必须使用
-Dyjp.zero.time.methods=假
为了让 UI 显示适当的 WALL TIME。默认情况下为真,并覆盖所有内容,包括挂钟时间设置。
放置位置取决于操作系统和 Yourkit 版本:https://www.yourkit.com/docs/kb/open_huge_snapshot.jsp 对我来说(MacOS 和 Yourkit 2015 版)恰好是:
<key>JVMOptions</key>
<array>
...
<!-- my fix to the UI-->
<string>-Dyjp.zero.time.methods=false</string>
</array>